2017-08-03 4 views
2

iOS Deployment Target: iOS 9.3, Base-SDK: Die neueste iOS (iOS 11.0), Xcode 9 Beta 4, Swift 4Swift 4 - Xcode 9 Beta 4 - NSKernAttributeName vs NSAttributedStringKey

Der folgende Code erstellt und Läufe in Swift 3, Xcode 8:

let kern = (CTRunGetAttributes(run) as? [String : Any])? 
[NSKernAttributeName] as? CGFloat ?? 0 

jedoch der Migrator Swift 4 wandelt es dazu:

let kern = (CTRunGetAttributes(run) as? [String : Any])? 
[NSAttributedStringKey.kern] as? CGFloat ?? 0 

Xcode 9 jetzt klagt:

Cannot subscript a value of type '[String : Any]' with an index of type 'NSAttributedStringKey' 

Inspektor Laut 'NSAttributedStringKey' ist nur in iOS 11. verfügbar (Beachten Sie, dass ich iOS 9 bin Targeting).

Wenn ich "NSAttributedStringKey.kern" durch "NSKernAttributeName" ersetze, bleibt der Fehler bestehen.

Command-Klick auf 'NSKernAttributeName' sagt mir, dass seine Verfügbarkeit iOS 6 ist. Der Inspektor behauptet aber, sein Typ ist '', die nur in iOS 11 verfügbar ist. Ich weiß nicht, ob dies nur ein ist Artefakt der API-Präsentation, oder ein suff-up, oder etwas, das ich vermisse.

Frage: Wie kann ich NSKernAttributeName (oder seine modernisierte Version) mit Abwärtskompatibilität zu iOS 9, mit Swift 4?

Vielen Dank für jede Hilfe.

Antwort

7

Geben Sie das Wörterbuch als [NSAttributedStringKey: Any] anstelle von [String: Any] ein. Es ist alles Zucker in der Swift-Overlay, so sollte es auch auf älteren MacOS/OS X-Versionen funktionieren.

EDIT: Ich sollte meinen letzten Satz ein wenig klären. NSAttributedStringKey, sowie alle anderen neuen "Schlüssel" -Typen in Swift 4, existieren nur in Swift und nicht in Objective-C. Wenn ein Wörterbuch mit NSAttributedStringKey-Schlüsseln zu Objective-C überbrückt wird, werden alle Schlüssel in NSStrings umgewandelt. Da die eigentlichen Frameworks von Foundation, UIKit usw., mit denen Sie arbeiten, in C/Objective-C geschrieben sind, wird dies "einfach funktionieren", und Sie müssen sich nicht um die Dokumentation kümmern, dass NSAttributedStringKey nur 10.11 ist.

+0

Vielen Dank dafür. Und die Erklärung wurde sehr geschätzt. – Womble

0
textField.defaultTextAttributes[NSAttributedStringKey.kern.rawValue] = 16 
0

Swift 4

Wenn Sie nicht wollen, um die Warnung zu ignorieren und unabhängig werfen, können Sie sie in ein neues Wörterbuch sauber kopieren.

var attributes: [NSAttributedStringKey: Any] = [:] 
textField.defaultTextAttributes.forEach{ 
    attributes[NSAttributedStringKey(rawValue: $0.key)] = $0.value 
} 
Verwandte Themen