以下代码对我来说很奇怪。
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)
}
}
它总是低于编译器错误。
但是,如果我使用self.boundingRect
,它将成功编译并运行该应用程序,但是在模拟器上启动应用程序后,它会自动恢复为boundingRect
(删除自我)。
所以每次我需要添加self.
来执行应用程序。
答案 0 :(得分:3)
这是因为boundingRect
是NSString
的{{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(...)。