我在String
上有一个定义test
的扩展程序。我还希望能够从test
获得NSString
的功能。在实际代码中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()
答案 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
}
}