NSString 扩展方法不调用字符串扩展方法



我在String上有一个定义test的扩展。 我还希望能够从NSString获得test的功能。 在实际代码中,String.test更复杂。 因此,我没有重新实现它NSString而是str投给String并打电话给test。 我在这里的理解是,现在str属于String类型,String.test将被调用,返回String Test

但是,似乎str.test()最终调用了NSString.test,而我最终会无休止地递归,直到堆栈溢出。

import Foundation
extension NSString {
    func test() -> NSString {
        let str = self as String
        return str.test() as NSString
    }
}
extension String {
    func test() -> String {
        return "String test"
    }
}
let s: NSString = "test"
s.test()

将第一个函数更改为:

func test() -> NSString {
    let str = self as String
    return ("" + str.test()) as NSString
}

这应该让你开始...

然后提交错误报告。

extension NSString {
    func test() -> NSString {
        let str = (self as String).test()
        return str as NSString
    }
}

我实际上并没有意识到它这样做了,但显然 Swift 会自动公开您在NSString上定义的扩展方法String。因此,您实际上可以删除String版本,而只使用NSString版本。或者,如果你想避免将字符串桥接到 Obj-C 中只是为了调用你的方法,你可以将实现拉出到一个私有全局函数(而不是扩展方法(中,并从两个实现中调用它,如下所示:

import Foundation
private func stringTest(_ str: String) -> String {
    return "String test"
}
extension NSString {
    func test() -> NSString {
        return stringTest(self as String) as NSString
    }
}
extension String {
    func test() -> String {
        return stringTest(self)
    }
}

最新更新