“可选类型'Set <string>的值?”必须解开”,但我没有要求

时间:2018-12-24 16:53:47

标签: swift

Xcode抱怨“可选类型'设置的值?'必须解包以引用已包装基本类型'Set'的成员'contains'“

功能如下:

func talks_to (_ dialog_dict: Dictionary<String, Set<String>>, one: String, two: String) -> Bool {
        return dialog_dict[one].contains(two)
    }

这是一个嵌套函数,仅用于使逻辑更清楚,并且外部代码保证参数不为空。我如何迅速理解这一点?

2 个答案:

答案 0 :(得分:3)

每次使用下标从字典中获取项目时,结果都是Optional,因为可能找不到您使用的密钥。 Sh_Khan给了您一个很好的优雅解决方案:(已投票)

return dialog_dict[one]?.contains(two) == true

之所以可行,是因为nil不等于true,但是编译器将对其展开包装,并检查其中的值以查看是否等于nil(如果不是nil)。因此,如果dialog_dict[one]的结果为nil或false,则它不等于true。仅当dialog_dict包含键one的值且该值为true时,表达式才会返回true

答案 1 :(得分:2)

制作

return dialog_dict[one]?.contains(two) == true

return dialog_dict[one]!.contains(two) 

dialog_dict[one]返回可选