JSPatch在Swift项目中的使用

来源:互联网 发布:htct328t软件下载 编辑:程序博客网 时间:2024/06/07 20:30

本博客迁移来自: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
谢谢。

0 0