JSPatch在Swift項目中的使用

本博客遷移來自:http://www.jianshu.com/users/465865c268ed/latest_articles
現在的這個項目從1月份開始做,到現在也快一年了,聽起來感覺項目很大似得,其實只是效率慢的緣故(後臺慢,需求慢…,種種我就不吐槽了)。
大概從7月份開始,項目中新的需求我嘗試着用Swift去寫,由此開始,項目變成了OC和Swift的混編項目了(安裝包足足大了好幾倍)。從兩個文件變成一個文件,倒也清爽了許多,瞬間找回了當年寫JAVA的感覺(兩年前寫了半年的JAVA EE之後轉投進了iOS的大坑中)。
說說感受,一個橋接文件搞定了OC和Swift的引用,卻也沒顯得有多複雜,不過最蛋疼的當屬使用CocoaPods了,在混編中可能會出現有些Swift第三方庫使用不了報錯的現象,搞了了好久也沒有解決,最後終級辦法就是直接拖進項目中(比如snpKit,R.Swift…….)
接下來回到正題,在混編之前,出現bug也用JSPatch修復,混編之後一直沒有嘗試用JSPatch去修復Swift的bug,看了看文檔大概知道在Swift中使用Method Swizzling有這麼幾點需要注意:(這是引用別人的話)

1: 繼承自NSObject的Swift類,其繼承自父類的方法具有動態性,其他自定義方法、屬性需要加dynamic修飾纔可以獲得動態性。
2: 若方法的參數、屬性類型爲Swift特有、無法映射到Objective-C的類型(如Character、Tuple),則此方法、屬性無法添加dynamic修飾(會編譯錯誤)。
3:純Swift類沒有動態性,但在方法、屬性前添加dynamic修飾可以獲得動態性。

今天發現發現存在bug,決定試試
Swift存在bug的代碼如下:

dynamic var model : WGPandianListModel = WGPandianListModel(){
        willSet{

        }
        didSet{
            let state : Int = Int(model.checkFlag as String)!;
            self.storeName.text = model.storeName as String;
            stateControlWith(state);
        }
    }

由於手賤把狀態判斷錯了,所以需要使用JSPatch重寫model的setModel方法,修改掉bug。
之前在OC中是針對出錯的地方所在的類用defineClass(‘XXXX’, {})重寫或新建就行,但在Swift中的區別是類名之前要加上項目名稱(如我的項目名稱是Demo,類名是XXX, 則使用

defineClass('Demo.XXX', {})

所以重寫set方法如下:

require('WGPandianListModel');
require('WGNoPandianStoreListCellView');
require('NSMutableDictionary');
require('YingXiaoGuanJia');
require('UITableViewCell');
require('UILabel');
require('UIFont');
defineClass('YingXiaoGuanJia.WGNotPandianStoreListCellView', {
  setModel:function(model){
       self.ORIGsetModel(model);
       var flag = model.checkFlag().integerValue();
       console.log(flag);
       self.storeName().setText(model.storeName());
       self.state().setFont(UIFont.systemFontOfSize(14));
       if (flag == 1) {
           self.state().setText("未盤點");
       } else if (flag == 2) {
           self.state().setText("已盤點");
       } else if (flag == 3) {
           self.state().setText("生效");
       } else {
           console.log("test,不可盤點");
           self.state().setText("不可盤點");

       }
  }




}, {});

然後扔進服務器中去完美解決。
由於沒有認真讀文檔,一直寫成defineClass(’XXX’,{})發現沒效果,之後才猛然發現是寫錯了。恩,希望各位讀者細心。
本文demo請訪問:https://github.com/voidxin/WGPandianSwift_JSPatchFile

ps:更多在Swift中使用JSPatch的講解和demo可以看看這位大神的github:https://github.com/adler0518/JSPatchSwiftSample
謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章