5

我正在尝试使用 JSONModel 将 json 映射到 Swift 中的模型。

如果模型没有 JSONModel 子类的属性,一切正常。

因此,在示例中这是有效的,并且它成功映射了属性:

class Person: JSONModel {

    var name: NSString?
    var gender: NSString?

}

但是如果我把JSONModel子类City,这个属性没有初始化,当我稍后尝试访问city属性时它会崩溃应用程序(我可以成功访问person.name和person.gender,但是在person.city上它没有崩溃任何信息):

class Person: JSONModel {

    var name: NSString?
    var gender: NSString?
    var city: City? // City is JSONModel subclass
}

如果 JSONModel 是 JSONModel 子类,它看起来无法映射/解析属性。有没有人经历过并解决了这个问题?

4

3 回答 3

7

JSONModel在 Swift 中不起作用,这就是您遇到问题的原因。从JSONModel 自述文件

注意:Swift 在底层的工作方式与 Objective-C 不同。 因此,我找不到在 Swift 中重新创建 JSONModel 的方法。Objective-C 中的 JSONModel 通过 CocoaPods 或作为导入的 Objective-C 库在 Swift 应用程序中工作。

您也许可以让它在某些极端情况下工作 - 但使用它的唯一可靠方法是针对它编写 Objective C 代码,并使用这些 Objective C 类。如果你想做纯 Swift,你应该看看其他库,比如Argo和其他一些库。

于 2015-07-06T15:35:22.160 回答
1

实际上 Swift 中 JSONModel 的问题如下:

它使用 Objc-runtime 来了解每个属性是什么类型,并且一旦您声明了 Obj-c 运行时不知道如何映射的类型,那么 JSONModel 只能将其映射为 String ..........或 NSNumber 如果您知道您有一个数字字段。

它的工作方式:因此,基本上,如果您将所有在您的案例中保持为 nil 的属性声明为字符串,您将开始看到值。如果您将数字字段声明为 NSNumber,则同样适用。String 和 NSNumber 也可以声明为可选项,对于 JSONModel 没有特定问题。

但是你敢不敢使用带有可选声明的 Swift 的原始类型(Int?、Double?、Bool?)。这行不通。

可行的是通过以下方式避免以任何方式声明为可选项:

1) var tmpInt : Int = 0,给出默认值

2) var tmpInt : Int!,强制

当然,这些最后的“变通办法”完全违背了 Swift 出现在这个世界上的原因,但这就是你如何将旧的 Objective-C 习惯带入新的现代 Swift (;

于 2015-11-23T09:12:34.787 回答
0

也许将访问级别设置为“公共”可能会有所帮助?

public class Person: JSONModel {
    public var name: NSString?
    public var gender: NSString?
    public var city: City? // City is JSONModel subclass
}

public class City: JSONModel {
    public var name: NSString?
}
于 2014-09-05T08:11:44.577 回答