NSFontAttributedString 在 XCode 6.1 之前工作

Posted

技术标签:

【中文标题】NSFontAttributedString 在 XCode 6.1 之前工作【英文标题】:NSFontAttributedString worked before XCode 6.1 【发布时间】:2014-10-22 03:21:24 【问题描述】:
let timeFont = [NSFontAttributeName:UIFont(name: "Voyage", size: 20.0)]
var attrString3 = NSAttributedString("(Time)", attributes : timeFont); // <--- compiler error "Extra argument in call"

此代码在 xcode 6.0 中工作,但现在我已升级到 xcode 6.1,它不再工作,我无法弄清楚我需要什么才能让它恢复工作。它说有一个额外的论点,但这是不正确的。我相信这与新的可失败初始化程序有关,但我尝试过的一切都不起作用。

【问题讨论】:

【参考方案1】:

您的代码无法编译有两个原因:

您现在要使用的 NSAttributedString 的初始化程序需要显式标记 string 参数 您现在使用的 UIFont 初始值设定项返回一个可选值(即 UIFont?),在将其传递到属性字典之前需要对其进行解包。

试试这个:

let font = UIFont(name: "Voyage", size: 20.0) ?? UIFont.systemFontOfSize(20.0)
let attrs = [NSFontAttributeName : font]
var attrString3 = NSAttributedString(string: "(Time)", attributes: attrs)

注意使用新的合并运算符 ??。这会展开可选的 Voyage 字体,但如果 Voyage 不可用(在 Playground 中似乎就是这种情况),则会退回到系统字体。这样,即使您的首选字体无法加载,您也可以获得属性字符串。

【讨论】:

【参考方案2】:

Xcode 6.1 附带支持可能失败的构造函数的 Swift 1.1。 UIFont 初始化可能失败并返回 nil。在创建NSAttributedString时也要使用string:

if let font = UIFont(name: "Voyage", size: 20.0) 
    let timeFont = [NSFontAttributeName:font]
    var attrString3 = NSAttributedString(string: "(Time)", attributes : timeFont)

【讨论】:

以上是关于NSFontAttributedString 在 XCode 6.1 之前工作的主要内容,如果未能解决你的问题,请参考以下文章

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据