谁能解释一下为什么在非可选子数组上进行可选链?我对苹果的Swift文档给出的解释感到困惑:
如果一个下标返回一个可选类型的值——比如Swift的Dictionary类型的key下标——在下标的右括号后面加一个问号来连接它的可选返回值:
文档的例子:
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Dave"]?[0] = 91
testScores["Bev"]?[0]++
testScores["Brian"]?[0] = 72
// the "Dave" array is now [91, 82, 84] and the "Bev" array is now [80, 94, 81]
声明不应该是:
var testScores:[String:Array<Int>?] = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
这是关于访问可选类型
我认为这里的混乱是字典testScores
是非可选的,但值testScores["Dave"]
是可选的。原因是,每当你从字典中请求一个值时,它可能就在那里…也可能不会。从字典返回是一个本质上可选的操作。考虑一下如果你说,testScores["Fred"]
——这将返回nil
。因为可以返回一个对象,也可以返回nil
,所以下标Array
的Dictionary
将返回一个可选的Array
。因此,返回类型([Int]?
)不同于值类型([Int]
)。
你给出的第二个例子略有不同。在第二个示例中,元素本身是可选的,而不是返回类型是可选的。这意味着你可以有这样的内容:
let array1 = [0, 1, 2]
let array2: [Int]? = nil
let dict = ["Fred": array1, "Wilma": array2] // [String: [Int]?]
在这种情况下,您实际上有两层可选(一个可选的int数组,[Int]??
),并且需要访问这样的元素:
let x = dict["Fred"]??[0]