将 Swift Dictionary 转换为 NSMutableDictionary 的这两个选项有什么区别?

What is the difference between these two options for converting Swift Dictionary to NSMutableDictionary?

在我的项目中,我有一个 [String: AnyObject] 类型的字典,正在将其转换为 NSMutableDictionary 以与项目中的某些 Objective C 代码兼容。

我开始使用以下转换选项(我在许多堆栈溢出帖子中将其视为可接受的答案):

dictionary as? NSMutableDictionary

这在大多数情况下有效,但在某些情况下结果为 nil,这表明字典无法转换为 NSMutableDictionary。然而,在字典中使用完全相同的值,下面的转换成功地产生了 NSMutableDictionary:

NSMutableDictionary(dictionary: dictionary)

当第二个选项能够毫无问题地转换时,为什么第一个选项会导致 nil?

你可以在这里看到第一个选项是公认的答案,但它似乎并不适用于所有情况。第二个选项也被提及,但没有那么多人同意它是正确答案。

This works in most cases

不,这根本行不通。

不像immutableNSDictionarySwiftDictionaryNSMutableDictionary没有关系。

您可以桥接转换(as 没有 ?[String:String]NSDictionary 但您不能桥接转换也不能有条件地向下转换(as?NSMutableDictionary.

第二种语法有效,因为创建了 NSMutableDictionary 的新实例。 Swift 字典参数隐式桥接到 NSDictionary


同样的行为也适用于 Swift Array 和 Foundation NSMutableArray