如何在 SWIFT 中从 JSON 初始化



我有一个 api ex:-

{data:[{name:a,location:{city:h}},{}],a:{},b:{}}

这是模式.我正在开发这种mvvm方法。

所以我为此创建了一个模型

我给出的是:-

var city:string!
var name:string!

我需要从中获取值.

前任:

init?(dictionary :JSONDictionary) {
            guard let name = dictionary["name"] as? String,
                let description = dictionary["description"] as? String else {
                    return
            }
            self.name = name
            self.description = description
        }

下面是一个示例。 那么如何使用 swift 获取模型中的值

示例

示例:- 宿舍模型

class hostelmodel{

        var name :String!
        var description :String!
        init?(dictionary :JSONDictionary) {
            guard let name = dictionary["name"] as? String,
                let description = dictionary["description"] as? String else {
                    return
            }
            self.name = name
            self.description = description
        }

}

在酒店景观模型:-

 class hostelviewmodel:NSObject{

        var datasourceModel:DataSourceModel
        init(withdatasource  newDatasourceModel:DataSourceModel) {
            datasourceModel = newDatasourceModel
        }

        func datafordisplay(atindex index: Int) -> hostelmodel {
          return  datasourceModel.dataListArray![index]
        }
    }

在数据源模型中:-

class DataSourceModel: NSObject {
    var dataListArray:Array<hostelmodel>? = []

    init?(array :Array<[String:Any]>) {
        var datalist:Array<hostelmodel> = []
        for dict in array{
            let model = hostelmodel(dictionary: dict)
            datalist.append(model!)
        }
        self.dataListArray = datalist        
}
}

在宿舍景观:-

 private var HOSTELMODEL :hostelmodel!
    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, withViewModel viewModel:hostelviewmodel) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        HOSTELMODEL = viewModel
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

我不知道应该在表视图数据源中给出什么。这里。。。

最后是网络服务类:-

私有变量网址

= 网址(字符串:"https://example.com"(!typealias JSONDictionary = [String:Any]

class WebService{
    func loadFlowers(completion :@escaping ([hostelmoddel]) -> ()) {
        URLSession.shared.dataTask(with: url) { data, _, _ in
            if let data = data {
                let json = try! JSONSerialization.jsonObject(with: data, options: [])
                let dictionaries = json as! [JSONDictionary]
                let model = DataSourceModel(array: <#T##Array<[String : Any]>#>)
                DispatchQueue.main.async {
                    completion(dictionaries.flatMap(hostelmodel.init))
                }
            }
            }.resume()
    }


}

此代码未完全完成。所以这就是模式.那么如何获取值并在表格视图中显示值。它必须在 mvvm 方法中,并且不应使用情节提要。怎么办 .

如果你可以迭代"data"数组中的值,那么你正在寻找的类结构是这样的:

    class ModelName {
        var name: String?
        var city: String?
        init(_ dictionary: Dictionary<String, Any>) {
            if let name = dictionary["name"] as? String, let location = dictionary["location"] as? [String: Any], let city = location["city"] as? String {
                self.name = name
                self.city = city
            }
        }
    }
    class BusinesLogic {
        var dataList: [ModelName]?
        func getList() -> [ModelName]? {
            return dataList
        }
        func initializeData(_ rawDataArray: [[String : Any]]) {
            rawDataArray.forEach { rawData in
                dataList?.append(ModelName.init(rawData))
            }
        }
    }
// so to use:
    let sample = BusinesLogic()
    sample.initializeData([DATA ARRAY HERE])
    sample.getList()