Swift beta7 中的 NSString.sizeWithAttributes()
Posted
技术标签:
【中文标题】Swift beta7 中的 NSString.sizeWithAttributes()【英文标题】:NSString.sizeWithAttributes() in Swift beta7 【发布时间】:2014-09-05 13:39:57 【问题描述】:下面这段代码在 Xcode 6 beta 5 中运行良好:
func fitText()
let size = (self.text as NSString).sizeWithAttributes([NSFontAttributeName:self.font]) //Errors here
self.frame.size = size
现在它在第二行给出以下错误:
“UIFont”不是“NSDictionary”的子类型
无法将表达式的类型“$T6”转换为类型“UIFont”
当我把它拆分成
let dict = [NSFontAttributeName:self.font]
let size = (self.text as NSString).sizeWithAttributes(dict) //Even stranger errors go here
xcode 说:
“UIFont”不是“NSDictionary”的子类型
无法将表达式的类型“[NSString : UIFont]”转换为类型“CGSize”
在 beta 7 或 6 中,swift 发生了什么变化,它破坏了代码?
【问题讨论】:
【参考方案1】:通过将隐式展开的可选项转换为显式可选项,已在 beta 7 中修复了几个具有可选和可选属性的方法签名。
在您的情况下,我假设 text
属性被声明为 String!
(隐式展开),而现在它是 String?
。因此,您必须以隐式方式打开它:
let size = self.text!.sizeWithAttributes(dict)
或更好地使用可选绑定:
if let text = self.text
let size = text.sizeWithAttributes(dict)
【讨论】:
展开使其工作。知道这些乱七八糟的错误消息是什么吗? 嗯...快速错误消息对于找出问题所在从来没有用处。例如,它碰巧说一个类不符合协议,但确实如此,或者一个类不符合某个属性等。我认为在这个主题上还有很多工作要做,我希望会很快就会修好。 作为一般规则,当错误消息没有任何意义时,那么它是对其他东西的错误使用 - 但在某些情况下,它是关于可选的。但它也可以是没有@obj 属性的协议、使用对其他属性的引用初始化的类属性、桥接类中泛型的使用等。【参考方案2】:你的 fitText
函数对我来说很好用。
如果有帮助,以下是我在安装新版本 Xcode6-beta 后第一次运行时通常会做的一些事情:
-
在 Xcode > 首选项 > 选择最新命令行工具的位置下仔细检查
删除构建和 DerivedData 文件夹
重启 Xcode
构建
【讨论】:
以上是关于Swift beta7 中的 NSString.sizeWithAttributes()的主要内容,如果未能解决你的问题,请参考以下文章
在 XCode 6 beta 7 中从 Swift 在 iOS 中打印
Android MotionLayout autoTransition 在 beta7 中不起作用