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

在里面!不会在 Swift 中被继承

[iOS开发]JSONModel源码学习

iOS - 正在释放的对象?