天天看點

iOS開發之周遊Model類的屬性并完善使用Runtime給Model類指派

  通過Runtime來給Model類屬性指派的好處是多多的,它便于代碼的後期維護,并且提高了開發效率。當你拿到解析後的字典時你不用一個一個的通過key去把字典的值指派給相應的Model類的屬性,本篇部落格中會給出如何去周遊Model中屬性的值,并且給出字典的Key和Model的屬性名不一樣的情況我們該如何負值。

  接下來會在上一個部落格代碼基礎上在Model基類中添加通過Runtime來周遊Model類的屬性值。

  一、擷取Model的實體屬性

  1.要想周遊Model類的屬性,首先得通過Runtime來擷取該Model類有哪些屬性,輸出Model的所有屬性的值可不像周遊Dictionary和Array那樣一個for循環搞定的,下面的方法是通過Runtime來擷取Model類的屬性字元串,并以數組的形式傳回。代碼如下:

  2.擷取到Model類的屬性方法後需要把屬性字元串生成get方法,我們可以執行get方法來擷取Model屬性的值,下方的方法是根據屬性字元串來擷取屬性的getter方法,OC中屬性的getter方法的名字和屬性的名字是一緻的,生成getter方法比較簡單,具體代碼如下:

  二、Get方法的執行

    接下來要做的是通過Runtime來執行Getter方法,這一塊需要通過方法的簽名來執行Getter方法。在OC的運作時中要執行的方法需要傳入參數或者需要接收傳回值時,需要通過方法的簽名來調用方法。下面的代碼就是建立方法的簽名,然後通過簽名來擷取調用的對象,在下邊的方中回調用上述兩個方法在通過方法的簽名來擷取Model屬性的值,具體代碼如下:

  執行上述方法就可以輸入Model中的屬性的值,下面就在main函數中對Model賦完值後調用上述方法輸出一下Model的屬性值,調用代碼如下所示:

  運作結果如下,下面的輸出結果是Model中屬性的值。

iOS開發之周遊Model類的屬性并完善使用Runtime給Model類指派

  三、Dictionary的Key與Model的屬性不同的處理方式

    有時候會遇到字典的key和Model的屬性不一樣的情況,那麼如何去解決這個問題呢?最簡單的做法是在具體的實體類中去維護一個映射關系方法,通過這個方法我們可以擷取相應的的映射關系。

    1.在Model的基類中添加一個傳回映射字典的一個方法,然後在子類中進行重寫,這個映射方法在基類中傳回nil, 如果子類需要重寫的話就對這個方法進行重寫并傳回映射字典。方法如下:

  2.修改一下我們的便利初始化方法,在有映射字典的情況和沒有映射字典的情況下調用的方法是不一樣的,便利初始化方法的代碼如下:

  3.接下來就将實作有映射關系要調用的方法,這個方法就是通過映射關系把字典的key轉換成與property的名字一樣的字典,然後調用之前的指派方法,具體代碼如下:

  4.建立一個BadBoyModel, 并重寫propertyMapDic方法,并且在propertyMapDic方法中給出映射關系并傳回該映射關系對應的字典。

    (1)BadBoyModel的屬性如下:

    (2)重寫映射方法,映射字典的key是要轉換字典的key, Value是對應Model的屬性名。

5.在main函數中進行測試

      (1)、生成我們的數值字典,字典的key與要指派Model的屬性不同,下面的循環就是要生成測試使用的資料:

      (2) 執行個體化Model并輸出結果,當然之前的代碼也是可以使用的。

    運作輸出結果如下:

iOS開發之周遊Model類的屬性并完善使用Runtime給Model類指派

    今天部落格就到這,至此,Model的基類最基本的方法封裝的也就差不多了,根據具體需求可以在添加新的方法