Swift中重命名属性的后备

时间:2017-10-03 00:32:11

标签: ios swift uikit swift4 xcode9

我无法找到像

这样的东西的后备
UIFontDescriptor.AttributeName
NSAttributedStringKey.foregroundColor

这个问题出现在XCode 9中的Swift 4中。目前,我必须这样做

#if swift(>=4.0)
    if #available(iOS 11, *) {
        [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]
    } else {
        ["NSColor": UIColor.white]
    }
 #else 
       [NSForegroundColorAttributeName.rawValue: UIColor.white]

但是,对于UIFontDescriptor,我找不到适用于iOS 8的任何东西。另外,如果你能改进这个黑客也会很棒。

1 个答案:

答案 0 :(得分:2)

在Swift 4中,您使用UIFontDescriptor.AttributeName.xxxNSAttributedStringKey.yyy where xxx and yyy`是所需名称。

在Swift 3中,您使用UIFontDescriptorXXXAttributeNSYYYAttributeName,其中XXXYYY是所需名称。

只要您在iOS 8中存在使用的密钥,Swift 4代码就可以像iOS 11,10,9和8一样正常工作。您不需要#if或{{ 1}}。

这意味着以下代码可以在Xcode 9中用于部署目标为iOS 8或更高版本的应用程序:

#available

如果您需要使用Xcode 9和Xcode 8(Swift 4和Swift 3)构建此代码,那么您需要执行以下操作:

let fontDesc = UIFontDescriptor()
fontDesc.addingAttributes([ .name: "Helvetica" ])
let font = UIFont(descriptor: fontDesc, size: 14)
let dict = [ NSAttributedStringKey.foregroundColor: UIColor.green, NSAttributedStringKey.font: font ]
let attrStr = NSAttributedString(string: "Hello", attributes: dict)

请注意,在任何一组代码中,您都不会对任何键使用let fontDesc = UIFontDescriptor() #if swift(>=4.0) fontDesc.addingAttributes([ .name: "Helvetica" ]) #else fontDesc.addingAttributes([ UIFontDescriptorNameAttribute: "Helvetica" ]) #endif let font = UIFont(descriptor: fontDesc, size: 14) #if swift(>=4.0) var dict = [ NSAttributedStringKey.foregroundColor: UIColor.yellow, NSAttributedStringKey.font: font ] #else var dict = [ NSForegroundColorAttributeName: UIColor.yellow, NSFontAttributeName: font ] #endif let attrStr = NSAttributedString(string: "Hello", attributes: dict) 。你应该注意硬编码关键字符串。使用提供的常量。