美文网首页
JSPatch在Swift项目中的使用

JSPatch在Swift项目中的使用

作者: voidxin | 来源:发表于2016-11-03 20:26 被阅读182次

现在的这个项目从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
谢谢。

相关文章

  • JSPatch在Swift项目中的使用

    现在的这个项目从1月份开始做,到现在也快一年了,听起来感觉项目很大似得,其实只是效率慢的缘故(后台慢,需求慢......

  • 在Swift4中使用JSPatch

    前言 JSPatch平台SDK 1.7.5 以上版本可以通过苹果审核,我们这次尝试在Swift中使用JSPatch...

  • IOS关于热修复JSPatch

    一:关于JSPatch JSPatch : 是一个iOS动态更新框架,只需在项目中引入极小的引擎,就可以使用Jav...

  • OC和Swift 混编

    主要是做备忘 一、混编两种情况 在Objective-C项目中使用Swift 在Swift项目中使用Objecti...

  • OC项目中使用Swift

    Swift和OC 混编的两个方面 1.OC项目中使用Swift2.Swift 项目中使用OC OC项目中使用Swi...

  • Swift工程中下JSPatch的第一次

    JSPatch是什么、有什么用等一系列问题暂且不介绍说明,这里只简单说下Swift工程中使用JSPatch的几个注...

  • Object-C与Swift的混编

    关于swift与oc的混编分为两种情况: 1. 在swift项目中引入OC文件 在swift项目中使用oc的时候需...

  • JSPatch实现原理解析

    JSPatch JSPatch是一个iOS动态更新框架,只需要在项目中引入极小引擎,就可以使用javascript...

  • JSPatch使用 私有变量操作

    基本使用 ** JSPatch 官方平台 ** ** JSPatch 语法转换 ** JSPatch基本使用 JS...

  • JSPatchDemo

    简介: JSPatch是最近业余做的项目,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何...

网友评论

      本文标题:JSPatch在Swift项目中的使用

      本文链接:https://www.haomeiwen.com/subject/gbliuttx.html