首页 > 解决方案 > Swift 的问题:可选类型 '[Int : Int]?' 的值 未拆封;你的意思是用'!' 或者 '?'?

问题描述

我目前正在快速学习,并且正在尝试创建一个函数,该函数将根据按下的按钮更新故事。我已经设置了按钮按下位,但随后我将按下按钮的标签传递给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
    }

}

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

任何指针将不胜感激。

标签: iosarraysswift

解决方案


因为字典查找返回一个可选的(可能缺少键),所以您需要先解开结果,next[storyIndex]然后才能对其进行索引。在此处使用?可选链接)来安全地解开该值。由于您需要结果,而不是比较 to nil,请使用if let可选绑定):

if let nextStory = next[storyIndex]?[myTag] {
    storyIndex = nextStory
}

如果storyIndex不是有效键,则为 ,next[storyIndex]可选nil链的结果为nil。如果myTag不是有效的键,结果也将是nil. 在两个键都有效的情况下,可选链的结果Int?nextStory绑定到解包值。


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

storyIndex = next[storyIndex]?[myTag] ?? 1

或(storyIndex对于查找失败保持不变):

storyIndex = next[storyIndex]?[myTag] ?? storyIndex

推荐阅读