使用未解析的标识符'boundingRect'

问题描述 投票:0回答:1

下面的代码我有一个非常奇怪的问题。

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.来执行应用程序。

ios swift ios-extensions
1个回答
3
投票

这是因为boundingRectNSStringextension方法

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(...)。

© www.soinside.com 2019 - 2024. All rights reserved.