下面的代码我有一个非常奇怪的问题。
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.
来执行应用程序。
这是因为boundingRect
是NSString
的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
它将起作用
extension NSString {
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)
}
}
来自Swift团队的编辑
https://bugs.swift.org/browse/SR-8408
编译器中的代码“NSString的成员显示在String值上”是专门寻找成员语法,即“foo.bar” - 或者在本例中为“self.bar”。它可能不应该这样写,但确实如此。
我认为我们仍然建议在这里明确,即使它很难看:(自我为NSString).boundingRect(...)或者让nsSelf = self为NSString; nsSelf.boundingRect(...)。