【问题标题】:Clarification for "Accessing Subscripts of Optional Type" in Swift对 Swift 中“访问可选类型的下标”的说明
【发布时间】:2015-07-30 21:59:14
【问题描述】:

谁能解释为什么可选链是在非可选子数组上完成的。我对 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 文档部分

【问题讨论】:

    标签: ios arrays swift multidimensional-array optional


    【解决方案1】:

    我认为这里的混淆在于字典 testScores 是非可选的,但值 testScores["Dave"] 是可选的。原因是任何时候你从字典中请求一个值,它可能在那里......或者它可能不在那里。从字典返回是一个固有的可选操作。考虑一下,如果你说过 testScores["Fred"]——这将返回 nil。因为可以返回一个对象,或者可以返回nil,所以下标Arrays 的Dictionary 会返回一个可选的Array。因此,返回类型 ([Int]?) 与值类型 ([Int]) 不同。

    您给出的第二个示例略有不同。在您的第二个示例中,元素 itself 是可选的,而不是返回类型是可选的。这意味着你可以有这样的东西:

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

    在这种情况下,您实际上有 两层 选项(一个可选的整数数组,[Int]??,并且需要访问这样的元素:

    let x = dict["Fred"]??[0]
    

    【讨论】:

    • 什么鬼? Apple 的 Swift 文档中没有任何地方提到这一点。哈哈。但你是对的。我在 xcode 操场上证实了这一点。我来自 C++ 编程背景,这个可选的东西对我来说很陌生。我永远不会猜到它返回了一个可选的。谢谢你!
    • 别担心!我的背景也是 C++,但我在 Swift 中工作的越多,我就越希望可选项成为 C++ 的标准部分——它们非常有用。我说“标准”是因为它们实际上确实作为experimental 功能存在。
    • 顺便说一句,这是否也适用于多维数组,而不仅仅是字典?
    • @WalterM 顺便说一句,如果这回答了您的问题,请考虑通过检查柜台下方的勾号来检查是否接受。 :-)
    • 你去 :)。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2014-12-21
    • 2022-01-22
    • 2016-08-11
    • 1970-01-01
    相关资源
    最近更新 更多