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

时间:2017-06-09 02:12:19

标签: swift nsstring extension-methods

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

3 个答案:

答案 0 :(得分:2)

将您的第一个功能更改为:

123

应该让你去...

然后提交错误报告。

HTH

答案 1 :(得分:0)

我实际上并没有意识到这样做了,但显然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)
    }
}

答案 2 :(得分:0)

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