Swift 在另一个字典上使用字典的键会崩溃

Swift 在另一个字典上使用字典的键会崩溃,swift,Swift,以下代码失败,xcode上出现错误。我不明白为什么。这是在XCode 9.3中尝试的 致命错误:在展开第if(值为!字符串)!=(dictionary[key]as!String){。这里key是x,dictionary[key]是nil,而dictionary有一个带x的键 您添加了isSubDictionary作为字典的扩展,因此self的类型是Dictionary,而不是Dictionary。这意味着self和Dictionary的键不相同 类型为AnyHashable的值隐藏,但仍然知道

以下代码失败,xcode上出现错误。我不明白为什么。这是在XCode 9.3中尝试的

致命错误:在展开第
if(值为!字符串)!=(dictionary[key]as!String){
。这里key是x,dictionary[key]是nil,而dictionary有一个带x的键


您添加了
isSubDictionary
作为字典的扩展,因此
self
的类型是
Dictionary
,而不是
Dictionary
。这意味着
self
Dictionary
的键不相同

类型为
AnyHashable
的值隐藏,但仍然知道该类型正在包装。写入时:

dictionary[key]
key
被包装在一个
AnyHashable
中,但是被包装的类型是
key
。因此当它被用作
字典的键时,被包装的类型
key
与第二个字典键中的包装类型不匹配。您可以通过以下方式看到这一点:

print("\(dictionary.keys.contains(self.keys.first!))") // prints false
如果您的意图是这两个词典属于同一类型,请执行以下功能:

func isSubDictionary(of dictionary: [Key: Any]) -> Bool

在这一行:
if(value as!String)!=(dictionary[key]as!String)
dictionary[key]
可能不存在。对于我作为参数传递给函数的变量,它不应该崩溃@LarmeDid您尝试调试吗?这可能很有趣,可以显示崩溃的内容以及您不理解的内容。比如添加
print(“dictionary:\(dictionary)”;print(“value:\(value)”;print(“key:\(key)”)
在将字典的“key”类型转换为所需类型时似乎出现问题。当我尝试时(value as!String)!=(dictionary[key as!String]as!String)“这似乎是可行的……我知道如果let,guard let,这个方法被用于单元测试用例代码中,我不介意它在解包时崩溃。对于我传递的参数,它不应该崩溃,而它正在崩溃,这似乎是一个奇怪的问题。@Moritz当然,如果他这样做,他可以摆脱整个
开关
。你是我想指出这一点!你是对的,我将值类型改回了
Any
。将代码更改为
扩展字典,其中Key==AnyHashable{func isSubDictionary(属于Dictionary:[Key:Any])->Bool{
可以正常工作
func isSubDictionary(of dictionary: [Key: Any]) -> Bool