2017-08-03 48 views
2

iOS的部署目標:iOS的9.3, 基地SDK:最新的IOS(iOS的11.0), 的Xcode 9 Beta 4的, 夫特4夫特4 - 的Xcode 9的β4 - NSKernAttributeName VS NSAttributedStringKey

下面的代碼建立和運行在夫特3時,Xcode 8:

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

然而,夫特4遷移它轉換成這樣的:

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

Xcode的9現在抱怨:

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

據探長說,「NSAttributedStringKey」僅在iOS的11提供(請記住,我中定位iOS 9)。

如果我將'NSAttributedStringKey.kern'替換爲'NSKernAttributeName',則錯誤仍然存​​在。

命令點擊'NSKernAttributeName'告訴我它的可用性是iOS 6.但是,檢查員也聲稱它的類型是'NSAttributedStringKey',它只在iOS 11中可用。我不知道這是否僅僅是一個API演示文稿的僞裝,或者一些東西,或者我錯過的東西。

問題:如何使用NSKernAttributeName(或其現代化版本)與Swift 4的向後兼容性iOS 9?

謝謝你的幫助。

回答

7

將字典鍵入爲[NSAttributedStringKey:Any]而不是[String:Any]。這是Swift覆蓋中的所有糖,因此即使在較舊的macOS/OS X版本中也應該可以工作。

編輯:我應該澄清我的最後一句話。 NSAttributedStringKey以及Swift 4中所有其他新的「Key」類型,只存在於Swift中,而不存在於Objective-C中。當帶有NSAttributedStringKey鍵的字典被橋接到Objective-C時,所有鍵都將變成NSStrings。由於您正在使用的實際Foundation,UIKit等框架是使用C/Objective-C編寫的,因此這將「僅僅工作」,您不必擔心聲明NSAttributedStringKey的文檔僅爲10.11。

+0

謝謝你。解釋非常感謝。 – Womble

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

斯威夫特4

如果你不想忽略警告,無論投,你可以將它們複製到一個新的字典乾淨。

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