Swift无法打开可选

时间:2016-06-11 18:38:46

标签: swift optional

  

给定一个模式和一个字符串str,找到str是否遵循相同的   图案。

     

以下是完全匹配,以便在两者之间存在双射   模式中的字母和str中的非空字。

     

例子:pattern =" abba",str ="狗猫猫"应该回来   真。

     

pattern =" abba",str =" dog cat cat fish"应该返回false。

     

pattern =" aaaa",str =" dog cat cat dog"应该返回false。

     

pattern =" abba",str ="狗狗狗狗"应该返回false。

     

注意:您可以假设模式仅包含小写字母和str   包含由单个空格分隔的小写字母。

class Solution
{
    func wordPattern(pattern: String, _ str: String) -> Bool
    {

        let arr = str.characters.split{$0 == " "}.map(String.init)
        if arr.count != pattern.characters.count
        {
            return false
        }

        var dict = [Character:String]()

        for i in (0...arr.count-1)
        {
            let cha = pattern[pattern.startIndex.advancedBy(i)]

            if dict.keys.contains(cha)
            {
                if dict[cha]! != arr[i]
                {
                    return false
                }
            }
            else
            {
                if dict.values.contains(dict[cha]!)
                //fatal error: unexpectedly found nil while unwrapping an Optional value
                {
                    return false
                }

                dict[cha] = arr[i]
            }

        }
        return true
    }
}


var test = Solution()
var result = test.wordPattern("abba", "dog cat cat dog")
print(result)
  

我不知道"致命错误:在展开时意外发现零   可选值"。任何帮助,我很感激。非常感谢你!

1 个答案:

答案 0 :(得分:1)

修改你的条件。

elsedict.keys.contains(cha)时,false分支执行,换句话说,当字典不包含cha时。然后,您尝试访问已知必须返回dict[cha]的{​​{1}}(因为nil不在字典中)。然后你试着打开它。展开cha会导致您的应用崩溃。

还要考虑条件是尝试检查从字典中获取的值是否包含在字典中。你想做什么?

你想要的只是(注意没有讨厌的nil):

!