Swift 4 - Xcode 9 beta 4 - NSKernAttributeName vs NSAttributedStringKey

时间:2017-08-03 00:02:56

标签: ios xcode swift4 xcode9-beta

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?

感谢您的帮助。

3 个答案:

答案 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
}