initWithDictionary:在 Objective-C 和 Swift 中
Posted
技术标签:
【中文标题】initWithDictionary:在 Objective-C 和 Swift 中【英文标题】:initWithDictionary: in Objective-C and Swift 【发布时间】:2016-06-11 10:21:47 【问题描述】:在 Objective-C 中,我们可以像这样使用带有 json 响应的对象映射
PolicyData *policyData = [[PolicyData alloc] initWithDictionary:responseObject error:&err];
在这里,我们可以将 responseObject 与 PolicyData 类属性进行映射。 我如何在 Swift 中做同样的事情?
【问题讨论】:
【参考方案1】:它应该像添加一个桥接头一样简单(因为PolicyData
很可能是用Objective-C 编写的)。有关如何执行此操作的说明can be seen in this Apple documentation。
然后您可以像这样轻松地创建 PolicyData
对象:
do
let newPolicyDataObject = try PolicyData(responseObject)
catch error as NSError
print("error from PolicyData object - \(error.localizedDescription)")
这假设您的 responseObject
是一个 NSDictionary。并且 Swift 2 有用 (?) 将错误参数转换为 try/catch 块。
也就是PolicyData的
- (instancetype) initWithDictionary:(NSDictionary *)responseObject error:(NSError *)err;
声明神奇地变成了
func initWithDictionary(responseObject : NSDictionary) throws
如本 Apple Objective-C/Swift 互操作性文档的 "Error Handling" section 中所述。
【讨论】:
init
方法很可能变成了PolicyData(dictionary:responseObject)
如果我在 swift 中创建 PolicyData 会怎样?在 func initWithDictionary(responseObject : NSDictionary) throws 中,我是否必须映射所有硬编码的字典键?我不想。
我不知道您的 PolicyData init
方法中的代码是什么样的...如果您正在使用 AFNetworking,other people have tried the approach 您正在考虑并且您可能会幸运地挖掘Stack Overflow.【参考方案2】:
你可以添加一个
convenience init?(dictionary: NSDictionary)
到你想从字典初始化的任何对象,并在那里初始化它的属性。
然而,由于 swift 没有动态调度(迟早),您可能无法将其概括为期望属性的名称是任何对象的字典中的键。
【讨论】:
你能解释一下为什么 Swift 没有动态调度吗?与 Objective-C 相比,它会给 Swift 带来任何优势吗? 动态调度会破坏swifts安全;使用动态调度,可能会在运行时切换不遵守编译器强制规则的实现。 非常感谢 Jan. 有没有参考了解详情?以上是关于initWithDictionary:在 Objective-C 和 Swift 中的主要内容,如果未能解决你的问题,请参考以下文章
ios Mantle - 正确覆盖默认 initWithDictionary
安装源码包inotify启动失败 error while loading shared libraries: libinotifytools.so.0: cannot open shared obje
mocha 和 ts-node UnhandledPromiseRejectionWarning:TypeError: Cannot convert undefined or null to obje