Swift的问题:可选类型'[Int:Int]的值?' 没有打开; 你的意思是用'!' 要么 '?'?

Sim*_*n R 0 arrays ios swift

我正在学习swift,我正在尝试创建一个函数,它将根据按下的按钮更新故事.我已经设置了按钮按下位,但是我将按下的按钮的标签传递给该updateStory功能.

func updateStory(myTag: Int) {

    let next = [
        1 : [
            1 : 3,
            2 : 2,
        ],
        2 : [
            1 : 3,
            2 : 4,
        ],
        3 : [
            1 : 6,
            2 : 5,
        ]
    ]

    // Error:(86, 17) value of optional type '[Int : Int]?' not unwrapped; did you mean to use '!' or '?'?
    if (next[storyIndex][myTag] != nil) {
        let nextStory = next[storyIndex][myTag]
        storyIndex = nextStory
    }

}
Run Code Online (Sandbox Code Playgroud)

StoryIndex被定义为类中的全局变量.

任何指针都将非常感激.

vac*_*ama 6

因为字典查找会返回一个可选项(键可能会丢失),所以您需要先打开结果,next[storyIndex]然后才能对其进行索引.在这里使用?(可选链接)安全地打开值.由于您需要结果,而不是比较nil,使用if let(可选绑定):

if let nextStory = next[storyIndex]?[myTag] {
    storyIndex = nextStory
}
Run Code Online (Sandbox Code Playgroud)

如果storyIndex不是有效密钥,那么next[storyIndex]将是nil,并且可选链的结果将是nil.如果myTag不是有效密钥,结果也将是nil.在这两个密钥是有效的情况下,任选的链的结果将是Int?nextStory将被绑定到展开的值.


如果您有一个默认值storyIndex(例如1)如果查找失败,您可以使用nil coalescing运算符 ??可选链在一行中执行此操作:

storyIndex = next[storyIndex]?[myTag] ?? 1
Run Code Online (Sandbox Code Playgroud)

或(storyIndex为了查找失败而保持不变):

storyIndex = next[storyIndex]?[myTag] ?? storyIndex
Run Code Online (Sandbox Code Playgroud)