有人可以解释为什么在非可选子阵列上完成可选链接。我对Apple的Swift文档给出的解释感到困惑:
如果下标返回一个可选类型的值 - 例如Swift的Dictionary类型的键下标 - 在下标的右括号后面放置一个问号,以链接其可选的返回值:
文档示例:
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]]
上的Apple Swift文档部分
答案 0 :(得分:2)
我认为这里的混淆是字典testScores
是非可选的,但值testScores["Dave"]
是可选的。原因是,每当你从字典中要求一个值时,它可能就在那里......或者它可能没有。从字典返回是一种固有的可选操作。考虑一下,如果你说过,testScores["Fred"]
- 这将会返回nil
。由于可以返回一个对象,或者可以返回nil
,因此Dictionary
Array
的{{1}}订阅会返回一个可选的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]