JSONModel в быстром выпуске

Я пытаюсь отобразить json для моделирования в Swift с помощью JSONModel.

Все работает, если у модели нет свойств, которые являются подклассами JSONModel.

Итак, в примере это работает, и он успешно отображает свойства:

class Person: JSONModel { var name: NSString? var gender: NSString? } 

Но если я поместил JSONModel подкласс 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. Кто-нибудь испытал это и решил?

Solutions Collecting From Web of "JSONModel в быстром выпуске"

JSONModel не работает в Swift , поэтому у вас проблемы. Из JSONModel readme :

NB: Swift работает по-другому под капотом, чем Objective-C. Поэтому я не могу найти способ воссоздать JSONModel в Swift . JSONModel в Objective-C работает в приложениях Swift через CocoaPods или в качестве импортированной библиотеки Objective-C.

Возможно, вы сможете заставить его работать в некоторых случаях с краями – но единственный надежный способ его использования – написать код Objective C против него и использовать эти классы Objective C. Если вы хотите сделать чистый Swift, вы должны посмотреть на другие библиотеки, такие как Argo и множество других.

На самом деле проблема с JSONModel в Swift заключается в следующем:

Он использует Objc-runtime для понимания того, какой тип является каждым свойством, и как только вы объявляете тип, который Obj-c runtime не умеет сопоставлять, тогда JSONModel может отображать его только как String ……… или NSNumber, если вы знаете, что у вас есть числовое поле.

Как это работает: в основном, если вы объявите все свойства, которые остаются нулевыми в вашем случае как строки, вы начнете видеть значения. То же самое работает, если вы объявляете числовые поля как NSNumber. И String, и NSNumber также могут быть объявлены как дополнительные, без особых проблем для JSONModel.

Но не смею использовать примитивные типы из Swift с необязательным объявлением (Int ?, Double ?, Bool?). Это не будет работать.

Что будет работать, избегая любыми способами, объявляя в качестве опций:

1) var tmpInt: Int = 0, дающее значение по умолчанию

2) var tmpInt: Int !, принуждение

Конечно, эти последние «обходные пути» полностью противоречат тому, почему Свифт появился в этом мире, но так вы привносите старые привычки Objective-C в новый современный Swift (;

возможно, это может помочь установить уровень доступа на «общедоступный»?

 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? } 

Наконец, нашел отличную замену JSONModel для Swift: EVReflection .

Работает с вложенными свойствами: подклассы EVObject , массивы подклассов EVObject и т. Д.