NSString 扩展方法不调用 String 扩展方法

NSString extension method doesn't call String extension method

我在 String 上有一个定义 test 的扩展。我还希望能够从 NSString 获得 test 的功能。在实际代码中 String.test 更复杂。因此,我没有为 NSString 重新实现它,而是将 str 转换为 String 并在其上调用 test。我的理解是,现在 strString 类型, 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
}

这应该让你继续......

然后提交错误报告。

HTH

我实际上并没有意识到它这样做了,但显然 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)
    }
}
extension NSString {
    func test() -> NSString {
        let str = (self as String).test()
        return str as NSString
    }
}