Swift4.0 KVC 字典赋值模型改变

 我们都知道KVC 是OC  NSobject特有的,之前在Swift4.0之前,继承NSobject的对象,可用动态的拿到字典调用KVC给模型赋值。只是比较省事的操作,有没有定义属性,只要从写UndefinedKey这个属性即可。

 还是用代码演示比如下面一个对象,从字典赋值

//
//  UserAccount.swift
//  WeiBo
//
//  Created by 张宇 on 2018/2/6.
//  Copyright © 2018年 张宇. All rights reserved.
//

//
//  用户账号Model
//

import UIKit

class UserAccount: NSObject {
    
    //MARK : 存储属性
    var  access_token:String = ""
    var  expires_in:TimeInterval = 0.0
    var  uid:String?
    
    init(dict:[String:Any]){
        super.init()
        setValuesForKeys(dict)
    }
    
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        
    }
    
    override var description: String{
        return  dictionaryWithValues(forKeys: ["access_token","expires_in","uid"]).description
    }
}

3.0这样写肯定是没有错误的,但是4.0的时候你就会发现一个问题forUndefinedKey这个方法每次都会调用,然后就崩溃了。


猜测原因:这是因为KVC是OC 的方法,OC方法和属性都需要运行时写到类对象中,swift 利用KVC设置属性需要运行时机制,swift4.0以前,编译器默认帮我们做了在对象声明前加上了@objc,4.0需要手动加上。


  //MARK : 存储属性
    @objc var  access_token:String = ""
    @objc var  expires_in:TimeInterval = 0.0
    @objc var  uid:String?

   这样就不会报错了。



你可能感兴趣的:(SWIFT)