为啥 Swift Dictionary 不可桥接?

Posted

技术标签:

【中文标题】为啥 Swift Dictionary 不可桥接?【英文标题】:Why is Swift Dictionary not bridgeable?为什么 Swift Dictionary 不可桥接? 【发布时间】:2015-06-01 10:54:59 【问题描述】:

Dictionary 是一种桥接类型,为什么我可以从 Swift 字典切换到 NSDictionary 而不是相反? (编译错误:NSDictionary 不能转换为 'Dictionary')

根据苹果的文档:

所有 NSDictionary 对象都可以桥接到 Swift 字典,因此 Swift 编译器在导入 Objective-C API 时会将 NSDictionary 类替换为 [NSObject: AnyObject]。

import Foundation

var swiftDict = ["0": "zero"]

let nsDict:NSDictionary = swiftDict
let backToSwiftDict:Dictionary = nsDict

【问题讨论】:

【参考方案1】:

这是正确的,但您必须执行从 NSDictionary 到 Dictionary 的类型安全转换

var swiftDict = ["0": "zero"]

let nsDict: NSDictionary = swiftDict
let backToSwiftDict: Dictionary = nsDict as Dictionary

【讨论】:

为什么演员阵容必须从 NS- 转到 Swift?编译器不能推断它是桥接类型吗? 不,您随后声明了一个 Swift Dictionary 并尝试为其分配一个 NSDictionary。演员表告诉编译器你确定你在做什么。它从 swift dict 到 NSDict 的原因是因为 NSDict 不关心其字段的类型。但是 Swift dict 确实在乎,所以简单地让它转换是不安全的。 不完全明白 - 你是说 NSDictionary 中有一些东西不能自动桥接到 Swift 吗? NSDict 确实关心其字段的类型 - 存储在 NSDict 中的所有内容都必须是 NSObject 派生的。【参考方案2】:

...或者您可以将其转换回具有类型安全字段的字典...

var swiftDict = ["0": "zero"]
let nsDict:NSDictionary = swiftDict
let backToSwiftDict = nsDict as! [String:String]

【讨论】:

谢谢 - 为什么!而不是 as? as! 用于强制强制转换。它用于你确信演员会成功的地方。 as? 用于强制转换可能失败的情况,通常与可选绑定结合使用,例如仅当转换成功时,let d = nsDict as? [String:String] 才会将结果字典分配给 d

以上是关于为啥 Swift Dictionary 不可桥接?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UICollectionView 单元格在我的 swift ios 应用程序中不可点击?

为啥 Swift 编译时间这么慢?

Swift:为啥字典中的键类型必须是 Hashable 类型 [重复]

Swift: 在Swift中桥接OC文件(自己创建的类文件第三方库文件)

swift里nsdictionary和dictionary有啥区别

Swift 字典 Dictionary 集合类型