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()的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vuetify@2.0.0-beta7

在 XCode 6 beta 7 中从 Swift 在 iOS 中打印

Android MotionLayout autoTransition 在 beta7 中不起作用

ASP.NET 5 beta7 CORS 不工作

从 ASP.NET vNext beta5 移动到 beta7 后 JWT Bearer 令牌身份验证错误

xcode6 beta7 prepareForSegue 抛出 EXC_BAD_ACCESS