【发布时间】:2018-09-26 00:06:18
【问题描述】:
以下代码编译时没有警告:
版本 1:
var anything: Any
anything = "woof"
有道理... Any 是任何类型、值类型或引用类型。
但是,如果我们创建像 Double? 这样的可选变量,则此代码会引发警告:
版本 2:
var anything: Any
let aDouble: Double? = 3
anything = aDouble
但是这段代码不会抛出警告:
版本 3:
enum AnEnum<T>: {
case first
case second (T)
}
var anEnum: AnEnum<String> = .first
anything = anEnum
您可以合理化版本 2 引发警告,因为 Any 不是 Optional 类型,而 Double? 是 Optional 类型。尝试将 Optional 分配给非可选类型是一种类型不匹配。
但是,在幕后,Optional 是带有 .none 大小写的 enum,以及带有 .some 大小写的 .some 大小写具有关联的值。我的版本 3 使用了 enum、AnEnum,它也有 2 个案例,其中的第二个有关联的值。 AnEnum 类型与 Swift 原生的 Optional 类型几乎相同。
为什么给anything分配一个AnEnum值可以,但是给anything分配一个Optional值就不行了?
(我开始回答这个问题:Swift dictionary with mix types (optional and non-optional))
然后意识到我真的不知道答案。
【问题讨论】: