我们都知道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?
这样就不会报错了。