NSString 扩展方法不调用 String 扩展方法
NSString extension method doesn't call String extension method
我在 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
}
这应该让你继续......
然后提交错误报告。
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
}
}
我在 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
}
这应该让你继续......
然后提交错误报告。
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
}
}