gpt4 book ai didi

ios - 为什么 Swift 推断元类型 'Any.Type' 而不是类型 'Any' ?

转载 作者:行者123 更新时间:2023-12-04 07:22:15 28 4
gpt4 key购买 nike

func giveMeZero<T>() -> T? {
print(T.self)
return 0 as? T
}
当在没有足够类型上下文的情况下调用上述函数时,
Swift 将返回类型推断为元类型“Any.Type”,我希望它推断“Any”或可能提供歧义错误。
// Calling code without type context, which exhibits the said behaviour
// prints 'no', since it's trying to cast 0 to Any.Type

if giveMeZero() != nil {
print("yes")
} else {
print("no")
}
输出:
"Any.Type\n"
"no\n"

最佳答案

为什么T不是 Any这很简单。没有==Any? 定义的运算符和 Any? , 如 Any不是 Equatable . T不可能是 Any .
为什么T可以 Any.Type这也很简单。有这样一个built in operator与此签名完全匹配。

func == (t0: Any.Type?, t1: Any.Type?) -> Bool
为什么它没有歧义
这更微妙。你会认为 T可能是 StringIntFloat , 对?毕竟都是 Equatable ,以及所有 Equatable类型, Optional defines a == and != for them .但是,似乎在全局范围内声明的运算符被认为比在 Optional 的条件扩展中声明的运算符“更好”。 ,所以运算符重载解析总是首先选择非扩展运算符。这是合理的 - 毕竟,添加扩展不应导致旧代码中断。
例如,添加此代码会使您的代码产生“模棱两可”的错误:
struct Foo {}

func ==(lhs: Foo?, rhs: Foo?) -> Bool {
true
}

func !=(lhs: Foo?, rhs: Foo?) -> Bool {
false
}
新增 != Foo? 的运算符以及 Any.Type? 的内置运算符被认为同样适合调用 giveMeZero() != nil .
但是,这不会:
struct Foo { }
extension Optional where Wrapped == Foo {
static func ==(lhs: Foo?, rhs: Foo?) -> Bool {
true
}

static func !=(lhs: Foo?, rhs: Foo?) -> Bool {
false
}
}

关于ios - 为什么 Swift 推断元类型 'Any.Type' 而不是类型 'Any' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68418050/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com