2016-07-11 23 views
6

In Swift 2 verwende ich CNLabeledValue.localizedStringForLabel(phoneNumber.label) und funktioniert gut.Wie bekomme ich localizedstring für CNLabeledValue in swift3

In swift 3 habe ich versucht, diese Zeile CNLabeledValue.localizedString(forLabel: phoneNumber.label!) bekam aber generic parameter 'ValueType' could not be inferred Fehler

Wie für CNLabeledValue in swift3 bekommen LocalizedString?

Antwort

23

In Swift 3 wird CNLabeledValue wie erklärt:

public class CNLabeledValue<ValueType : NSCopying, NSSecureCoding> : NSObject, NSCopying, NSSecureCoding { 
    //... 
} 

Es ist ein generischer Typ ist, und wenn Sie es in einem richtigen Kontext verwenden, haben Sie keine Notwendigkeit, seine value zu werfen. Swift 3 leitet die ValueType.

Aber in Ihrem Code hat Swift keinen Hinweis auf die ValueType. Es ist irgendwie ärgerlich, weil ValueType während der Ausführung der Typ-Methode unnötig ist. Aber das Typsystem von Swift muss es spezifizieren. Wenn Swift den Typ des ValueType nicht ableiten kann, können Sie es explizit angeben.

Versuchen Sie folgendes:

let localizedLabel = CNLabeledValue<NSString>.localizedString(forLabel: phoneNumber.label!) 
+0

Können Sie auf eine zusätzliche Erklärung geben, warum es notwendig ist, zu spezifizieren 'NSString' anstatt' String'? –

+2

@MurraySagal, der generische Parameter von CNLabeledValue wird als '' deklariert. In diesem Fall können Sie einen beliebigen Typ wählen, der "NSCopying" und "NSSecureCoding" entspricht. 'NSString' ist does und' String' nicht. – OOPer

+2

Vielen Dank für das herauszufinden. Warum es nicht Teil des Swift 3 Converters in XCode ist, entgeht mir ... –