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
谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值