Array 的 count 属性 是可选的吗?

Is Array's count property an optional?

我创建了一个类型别名:

typealias areasOfStudyType = Array<Dictionary<String, String>>

然后创建了一个可选变量:

var areasOfStudy : areasOfStudyType? = nil

我需要使用数组元素的数量将它们放在 table 视图中,所以我输入了:

areasOfAStudy?.count

我知道如果 areasOfStudynil 这行代码不会尝试获取 count 的值,因为我使用的是可选链接。但是当它不是 nil 时,它将 return 一个 Int.

然而,编译器抱怨我没有解包一个可选的并建议我输入:

(areasOfAStudy?.count)!

为什么 areasOfAStudy?.count 是可选的?当我查看 Array 的参考文档时,我读到:

count
The number of elements the Array stores.

Declaration
var count: Int { get }

计数不是可选的,但数组是。因此 areasOfAStudy?.count 是可选的,因为当 areasOfAStudy 为 nil 时,永远不会调用 count,因此它计算为 nil。

var areasOfAStudy: [String]? = nil
//This evaluates to nil because areasOfAStudy is nil. The type of a is Int?
var a = areasOfAStudy?.count
print(type(of:a))

这就是可选链的工作原理。

如果您有 let value = nonOptional.property,假设 propertynonOptional 不是可选的,那么 value 将不是可选的。

但是,如果您执行 let value = optionalObject?.property,即使 property 未定义为可选,您也可以通过可选链接访问它(这就是 ?. 的意思)所以因为 optionalObject 是可选的,那么 value 也是可选的,因为 optionalObject 可以是 nil.