我在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)
}
}