Ios 澄清;访问可选类型的下标";迅速地

Ios 澄清;访问可选类型的下标";迅速地,ios,arrays,swift,multidimensional-array,optional,Ios,Arrays,Swift,Multidimensional Array,Optional,有人能解释为什么在非可选子阵列上进行可选链接吗。我对苹果的Swift文档给出的解释感到困惑: 如果下标返回可选类型的值,如Swift字典类型的键下标,则在下标的结束括号后放置一个问号,以链接其可选返回值: 文档示例: var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]] testScores["Dave"]?[0] = 91 testScores["Bev"]?[0]++ testScores["Brian"]?[0] = 72

有人能解释为什么在非可选子阵列上进行可选链接吗。我对苹果的Swift文档给出的解释感到困惑:

如果下标返回可选类型的值,如Swift字典类型的键下标,则在下标的结束括号后放置一个问号,以链接其可选返回值:

文档示例:

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]]
var testScores:[String:Array?]=[“Dave”:[86,82,84],“Bev”:[79,94,81]]

这是苹果公司的Swift文档部分,我想这里的混淆是字典
testScores
是非可选的,但是值
testScores[“Dave”]
是可选的。原因是,任何时候你从字典中请求一个值,它可能在那里,也可能不在那里。从字典返回是一个固有的可选操作。如果你已经说过,<代码>测试分数[弗莱德] 这将返回<代码> nIL/COD>。由于可以返回一个对象,或者可以返回
nil
,订阅
Array
s的
Dictionary
将返回一个可选的
Array
。因此,返回类型(
[Int]?
)不同于值类型(
[Int]

你举的第二个例子有细微的不同。在第二个示例中,不是返回类型是可选的,而是元素本身是可选的。这意味着你可以有这样的东西:

let array1 = [0, 1, 2]
let array2: [Int]? = nil
let dict = ["Fred": array1, "Wilma": array2] // [String: [Int]?]
let x = dict["Fred"]??[0]
在这种情况下,您实际上有两层可选的元素(可选的Int数组,
[Int]?
),需要访问如下元素:

let array1 = [0, 1, 2]
let array2: [Int]? = nil
let dict = ["Fred": array1, "Wilma": array2] // [String: [Int]?]
let x = dict["Fred"]??[0]

到底什么?苹果公司的快速文档中没有任何地方能谈论这个。LOL。但是你是对的。我在XCLOCK游乐场上确认了这个。我来自C++编程背景,这个可选的东西对我来说是新的。我从来没有想到它会返回一个可选的。谢谢你!不用担心!我的背景也在C++中,但是管他的我在Swift工作的越多,我就越希望optionals是C++的标准部分——它们非常有用。我说的是“标准”因为它们实际上是作为一个特征存在的。顺便说一下,这也适用于多维数组,而不仅仅是字典吗?“WalterM,顺便说一下,如果这回答了你的问题,请考虑通过核对计数器下面的刻度标记来接受它。)-你走吧:)谢谢你的帮助!