Swift4.0 KVC 字典賦值模型改變

ZY_FlyWay發表於2018-02-06

 我們都知道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?

   這樣就不會報錯了。



相關文章