澄清"访问可选类型的下标"在斯威夫特

时间:2015-07-30 21:59:14

标签: ios arrays swift multidimensional-array optional

有人可以解释为什么在非可选子阵列上完成可选链接。我对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]]

以下是Accessing Subscripts of Optional Type

上的Apple Swift文档部分

1 个答案:

答案 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]