iOS部署目标:iOS 9.3, 基础SDK:最新的iOS(iOS 11.0), Xcode 9 Beta 4, 斯威夫特4
以下代码在Swift 3,Xcode 8中构建并运行:
let kern = (CTRunGetAttributes(run) as? [String : Any])?
[NSKernAttributeName] as? CGFloat ?? 0
但是,Swift 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
(或其现代化版本)向后兼容iOS 9和Swift 4?
感谢您的帮助。
答案 0 :(得分:8)
将字典键入[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的文档。 / p>答案 1 :(得分:3)
textField.defaultTextAttributes[NSAttributedStringKey.kern.rawValue] = 16
答案 2 :(得分:1)
Swift 4
如果您不想忽略警告和强制转换,可以将它们干净地复制到新词典中。
var attributes: [NSAttributedStringKey: Any] = [:]
textField.defaultTextAttributes.forEach{
attributes[NSAttributedStringKey(rawValue: $0.key)] = $0.value
}