可以说 Swift 中存在一个 nil 对象吗?因此,以声明为可选类型的数组为例。
var books : [Book]?
这个数组开始时是一个 nil 对象,但它是否仍然以某种方式存在,因为它被声明为可选,这表明它可能在某个时候有一个值?
仅仅就正确描述和理解一个 nil 对象而言,这是否准确:"一个 nil 对象还不存在,也没有价值,但后来可以通过被赋予一个值而存在"?
在 Swift 中,可选可以包含 nil
,但nil
本身表示缺少值。当你写一些你描述的东西时:
var books : [Book]?
空间被分配以在未来可能包含某些东西,并且它被初始化为一个Optional<Array<Book>>
,但它的值被分配为nil
,这实际上不存在。 nil
在技术上只是一个思想价值,因为变量可以nil
赋值。实际上,它是缺少一个 value
Swift 的可选类型是使用枚举实现的
enum OptionalValue<T> {
case none
case some(T)
}
因此,当 nil 分配给可选值时,我认为它分配了none
情况。 并分配了适当的内存。
您可以在此处获取更多详细信息:- https://github.com/apple/swift/blob/master/stdlib/public/core/Optional.swift
变量books
存在,但它不是对象。 它具有值 OptionalValue.none
.
值(或引用)以后可以分配给一个可选变量,但这并不能"使变量存在";它一直存在,只是没有分配给它。
创建分配给变量的对象、值或结构与创建变量本身是分开的。
正如 Aks 在他的答案中所说,可选的是具有两个可能值的枚举,.some
和 .none
。
引用Aks的回答(和Apple文档):
enum OptionalValue<T> {
case none
case some(T)
}
.none
事例不包含关联的值。
.some
事例包含关联的值。
Swift 枚举是使用泛型定义的,因此你可以有一个带有类型的可选枚举,如 Optional(Int)。
创建可选时,您将定义一个枚举。该枚举存在。把它想象成一个盒子。该框可能是空的(.none
大小写),也可能包含某些内容(.some
大小写),但该框在创建时存在。