【问题标题】:NSString.sizeWithAttributes() in Swift beta7Swift beta7 中的 NSString.sizeWithAttributes()
【发布时间】: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 发生了什么变化,它破坏了代码?

【问题讨论】:

    标签: swift nsstring ios8 xcode6 xcode6-beta7


    【解决方案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 后第一次运行时通常会做的一些事情:

    1. 在 Xcode > 首选项 > 选择最新命令行工具的位置下仔细检查
    2. 删除构建和 DerivedData 文件夹
    3. 重启 Xcode
    4. 构建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2019-11-21
      • 2016-01-06
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多