在Swift中,nil和Optional<T>.None是相同的吗?

9

我对Swift教程有些困惑。

nilOptional<T>.None的方便缩写吗?
它们之间是否存在隐式转换?

以下是几点观察:

  • Optional<String>.None == nil
  • nil字面量似乎具有NilType

如果这是一种隐式转换,那么我能否定义自己的类型来“接受”nil,或者Optional在这方面是否特殊?我认为定义可转换为nil的自定义类型不是一个好主意——我只是想了解这种情况下类型系统的工作原理。

1个回答

10
如果在声明可选变量或属性时不提供初始值,则其值会自动默认为nil。
它们的值相同,都是nil。
实际上,Optional.None是一个多态原始值,而nil是具有此值的常量。Optional是一个多态类型。nil的类型是Optional。这就是为什么您不能将nil分配给除Optional之外的任何其他内容的原因。出于同样的原因,您不能将true分配给除Bool之外的任何其他内容。
目前根据文档,您不能将nil用于任何自定义和任意类型,但可以用于可选项。
如果您的代码中的常量或变量需要在某些条件下能够处理缺少值,请始终将其声明为适当类型的可选值。

但是为什么你可以将 nil 分配给 Optional,而不能分配给其他任何东西呢?我能定义一个具有相同行为的 MyOptional 吗? - Dan Abramov
@Dan:我已经更新了答案来回答这个问题。看起来是不可能的。 - masoud
你是从哪里找到 Optional<T>.None 的信息的?我非常感兴趣。在苹果文档中,我看到了这样的描述:“在 Swift 中,nil 不是指针——它是某种类型值的缺失”。这是否有冲突,还是说它们是两种不同的表达方式? - ScottyBlades

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接