Swift 专栏swift3.0Swift

swift微博第16天(KVC字典转模型)

2017-12-10  本文已影响22人  IIronMan

下面以 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)
        
    }
上一篇下一篇

猜你喜欢

热点阅读