下面以 HomeViewModel 为例,我所求的数据类型为: 数组套字典
import UIKit class HomeViewModel: NSObject { // 微博创建的时间 var created_at: String? // 微博ID var id: Int = 0 // 微博信息内容 var text: String? // 微博来源 var source: String? // 微博配图数组 var pic_urls: [[String: AnyObject]]? class func loadStause(finshed: @escaping (_ models:[HomeViewModel]?,_ error:Error?)->()){ let account = UserAccount.loadAccount() // 1.定义路径 let path = "2/statuses/home_timeline.json" // 2.封装参数 let params = ["access_token":account?.access_token] NetworkTools.shareNetworkTools().get(path, parameters: params, progress: nil, success: { (_, JSON) in print(JSON!) /* 1.取出Stause key对应的数组(存储的都是字典) 2.遍历数组将字典转化为模型 */ let dict = JSON as! NSDictionary print("statuses=\(dict["statuses"]!)") if let statuses = dict["statuses"] as? [[String: AnyObject]] { let models = HomeViewModel.dict2model(array: statuses) finshed(models, nil) } }) { (_, error) in finshed(nil, error) } } // MARK: 字典转模型的方法 private class func dict2model(array:[[String: AnyObject]]) -> [HomeViewModel] { var models1 = [HomeViewModel]() for dict1 in array { models1.append(HomeViewModel(dict: dict1)) } return models1 } // 字典转模型 init(dict: [String: AnyObject]){ super.init() // 会调用 setValue forKey 给每一个属性赋值 setValuesForKeys(dict) } // 这句话的意思是字典转模型的时候 要一一对应的,为了防止没有的字段崩溃,那么就跳过(没有的字段会走这里的,不用做什么操作就好了) // override func setValue(_ value: Any?, forKey key: String) { // // print("找不到\(key)") // } override func setValue(_ value: Any?, forUndefinedKey key: String) { print(key) } // 打印当前的模型 static let properties = ["created_at","id","text","source","pic_urls"] override var description: String{ let dict = self.dictionaryWithValues(forKeys: HomeViewModel.properties) return "\(dict)" } }
模型的调用 一个简单的闭包
HomeViewModel.loadStause { (models, error) in if error != nil { return } self.homeViewModels = models print(self.homeViewModels!.count) }