使用未解析的标识符“ boundingRect”

时间:2018-07-30 09:03:33

标签: ios swift ios-extensions

以下代码对我来说很奇怪。

extension String {
        func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
            let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
            let boundingBox = boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil)

            return ceil(boundingBox.height)
        }
}

它总是低于编译器错误。

enter image description here

但是,如果我使用self.boundingRect,它将成功编译并运行该应用程序,但是在模拟器上启动应用程序后,它会自动恢复为boundingRect(删除自我)。

>

所以每次我需要添加self.来执行应用程序。

1 个答案:

答案 0 :(得分:3)

这是因为boundingRectNSString的{​​{1}}方法

extension

因此,如果您将extension NSString { @available(iOS 7.0, *) open func draw(with rect: CGRect, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey : Any]? = nil, context: NSStringDrawingContext?) @available(iOS 7.0, *) open func boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey : Any]? = nil, context: NSStringDrawingContext?) -> CGRect } 更改为String将会起作用

NSString extension

从Swift团队编辑

https://bugs.swift.org/browse/SR-8408

  

编译器中显示“ NSString的成员显示在字符串值上”的代码专门用于寻找成员语法,即“ foo.bar”,在这种情况下为“ self.bar”。可能不应该这样写,但是确实如此。

     

我认为,即使丑陋,我们仍然建议在这里明确:(将自身作为NSString).boundingRect(...)或让nsSelf = self作为NSString; nsSelf.boundingRect(...)。