为啥在这种情况下 Array 的元素是可选的?

Posted

技术标签:

【中文标题】为啥在这种情况下 Array 的元素是可选的?【英文标题】:Why are elements of Array in this case optional?为什么在这种情况下 Array 的元素是可选的? 【发布时间】:2019-09-01 13:03:27 【问题描述】:
let x = Array(repeating: "test", count: 3)
x.first.count

我有一个错误: “可选类型‘字符串’的值?必须解包以引用已包装的基本类型'String'的成员'count'"

我为什么要写:x.first?.count? 我很确定这个数组的第一个元素不是 nil

【问题讨论】:

你确定,但编译器不是。 另外,可选性不是关于第一个元素为nil 的可能性,而是关于数组为空的可能性(因此,根本没有第一个元素)。如果一个元素可以是可选的(例如[String?]),那么first实际上会返回一个双可选(String??)。 【参考方案1】:

我很确定这个数组的第一个元素不是 nil

是的,但它的实现不知道,它也是在不存在值的情况下编写的,所以可选来救援

extension Array  
   @inlinable public var first: Element?  get 

【讨论】:

【参考方案2】:

正如你所说,是确定第一个元素不是nil的人。所以应该强迫编译器解开它!

编译器唯一知道的是数组可能是空的,例如:[],并且其中没有元素,所以即使你确定它也会返回可选的。

所以如果你真的确定,就强行打开它:

x.first!.count

【讨论】:

x[0].count

以上是关于为啥在这种情况下 Array 的元素是可选的?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查子节点是否不存在?

scss 增加给定元素的可定位区域而不影响布局。需要垂直增加;水平是可选的。

为啥 UITableViewCell textLabel 属性是可选的?

Swift:如果变量 a 是非可选的,那么为啥变量 b 是可选的? [复制]

为啥 UITextField.text 是可选的?

为啥 C# 3.0 对象初始值设定项构造函数括号是可选的?