我正在尝试编写一个使用模板/泛型类型调度的库,但我无法弄清楚重载解析在 Swift 中是如何工作的。(有没有比The Swift Programming Language更多的技术参考?)
以下工作完全符合我的希望:
func f(_ v: String) { print(v) }
func f(_ v: String?) { f(v!) }
func f(_ v: Int) { print(v) }
func f(_ v: Int?) { f(v!) }
f("foo")
f(Optional("bar"))
f(2)
f(Optional(3))
这段代码也以同样的方式工作:
func g<T>(_ v: T) { print(v) }
func g<T>(_ v: T?) { g(v!) }
g("foo")
g(Optional("bar"))
g(2)
g(Optional(3))
但是当我编译这个时:
func h(_ v: String) { print(v) }
func h(_ v: Int) { print(v) }
func h<T>(_ v: T?) { h(v!) }
h("foo")
h(Optional("bar"))
h(2)
h(Optional(3))
我收到警告
all paths through this function will call itself
func h<T>(_ v: T?) { h(v!) }
果然,使用可选参数执行它会破坏堆栈。
我的第一个滑稽的理论是,也许泛型不参与非泛型的重载解决,但这是:
func i<T: StringProtocol>(_ v: T) { print(v) }
func i<T>(_ v: T?) { i(v!) }
i("foo")
i(Optional("bar"))
给了我同样的警告,第二次调用破坏了堆栈。
如果v
是 type Optional(String)
,我什至不明白如何v!
将其传递给期望 a 的泛型T?
。