为啥 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:为啥字典中的键类型必须是 Hashable 类型 [重复]
Swift: 在Swift中桥接OC文件(自己创建的类文件第三方库文件)