iOS之KVC字典轉模型的底層實現

KVC: Key Value Coding (鍵值編碼)

在iOS開發中,KVC是咱們常常要使用的技術.那麼KVC有什麼做用呢?簡單列舉一下下面幾種:ui

  • 取值和賦值(開發中基本不用)
  • 獲取對象私有變量的值.(常用,例如UIPageContorl分頁, 設置圓點爲圖片)
  • 改變對象私有變量的值(常用)
  • 簡單的字典轉模型(偶爾使用)
  • 模型轉字典
  • 批量取值

KVC字典轉模型的底層實現

  • 一般咱們手動將字典轉模型的話,會在模型中提供一個類方法接收一個字典,在這個方法中將字典轉換成模型,再將轉換好的模型返回.this

    + (instancetype)statusWithDict:(NSDictionary *)dict { Status *status = [[self alloc] init]; //利用KVC字典轉模型 [status setValuesForKeysWithDictionary:dict]; return status; }
  • 分析一下[status setValuesForKeysWithDictionary:dict]的底層實現原理編碼

    + (instancetype)statusWithDict:(NSDictionary *)dict { Status *status = [[self alloc] init]; //利用KVC字典轉模型 //[status setValuesForKeysWithDictionary:dict]; //setValuesForKeysWithDictionary:原理--遍歷字典中全部的key,去模型中查找對應的屬性,把值給模型屬性賦值 [dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { // 這行代碼纔是真正給模型的屬性賦值 [status setValue:obj forKey:key]; }]; return status; }
  • KVC字典轉模型弊端:必須保證,模型中的屬性和字典中的key一一對應。若是不是一一對應的話,就會報錯,仔細看一下錯誤信息,[<Status 0x7fd439d20a60> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key source.是系統調用了setValue:forUndefinedKey:報錯.若是想解決這個問題,只須要在模型中重寫對象的setValue:forUndefinedKey:,把系統的方法覆蓋, 就能繼續使用KVC,字典轉模型了。
    - (void)setValue:(id)value forUndefinedKey:(NSString *)key { }

囉嗦一點KVC的setValue:forKey:方法賦值的原理

  • 首先會去模型中查找有沒有對應key的setter方法,有就直接調用set方法方法賦值.
  • 上一步沒有的話,去模型中查找有沒有和key同名的屬性,有的話賦值給與key同名的屬性.
  • 上一步尚未的話,去屬性中查找有沒有和key同名的帶下劃線的屬性,有的話直接賦值.
  • 若是再沒有,那就直接調用對象的 setValue:forUndefinedKey:直接報錯



文/李小南(簡書做者) 原文連接:http://www.jianshu.com/p/a22ef43424f6 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。
相關文章
相關標籤/搜索