天天看點

swift 學習筆記 - ghwghw

最近在學習swift,我以前是寫C#的,後來才轉的OC,是以經常會抱怨為啥OC沒有泛型呀。現在swift出來了,而且還支援泛型,但是我實在忍不住要吐槽swift下了。

事情是這樣的,我們做應用的資料基本都是從服務端擷取的,服務端傳回的資料也基本都是json格式傳回的,然後在用戶端把json資料先轉成字典或數組。有的項目是直接把轉換好的josn字典胡數組拿來用,而大多數的項目應該是進一步的封裝,把json資料轉換成相應的類執行個體,這個過程我叫做DTO(data to object)。那怎麼把json資料轉換後的字典或數組轉換成對應的類的執行個體呢?這裡就會用到反射技術了,首先是根據類的名稱動态生成對象執行個體,然後對類的各個屬性指派,而這個指派的過程也有兩種方式,一種是直接使用setValuesForKeysWithDictionary指派,另外一種是使用反射把類的屬性清單給反射出來,然後使用kvc指派,我再項目中使用的是反射技術。

以上的DTO過程移植到swift中原理也一樣,無非就是反射的方法不一樣,但具體的原理是一樣的。而我遇到的問題出在哪裡呢?就出在泛型上面。我先舉個例子,看下面代碼

class ClassGeneric<T> {
    var property:T?
}      

在swift中是可以這樣寫的, 而這樣的代碼在C#中也差不多的。為什麼這樣寫,我想用過泛型類的朋友對這樣的寫法是不會陌生的,但是這樣的泛型類在swift中卻不支援kvc,如果你用kvc來設定屬性的話運作時會報"this class is not key value coding-compliant"。直接把我想通過泛型來做DTO的想法給斷了。

另外一個我想吐槽的是swift的反射實在是太弱了,能做的事情太少了。

swift 學習筆記 - ghwghw