我试图用Swift编写一些通用函数,并将版本限制为可选,但是我遇到的行为令我感到惊讶。
考虑以下代码(在操场上测试):
public protocol OptionalType {}
extension Optional: OptionalType {}
func asOptional<T>(_ t: T) -> T? { return t }
func asOptional<T>(_ t: T) -> T where T: OptionalType { return t }
class C {}
let c = C()
print(type(of: c)) // #1 - C
print(type(of: asOptional(c))) // #2 - Optional<C>
let optc: C? = C()
print(type(of: optc)) // #3 - Optional<C>
print(type(of: asOptional(optc))) // #4 - Optional<C>
func foo<T>(_ t: T) {
print(type(of: t)) // #5 - Optional<C>
print(type(of: t) == type(of: optc)) // #6 - true
print(type(of: asOptional(t))) // #7 - Optional<Optional<C>> -- why?
}
foo(optc)
为什么#4和#7打印相同?在我看来,#7处的asOptional()调用应调用受约束的版本,就像#4处的调用一样(毕竟,t
和optc
的类型与在上一行中选中)。为什么不?