oc swift混编实践问题总结

       

        swift已经慢慢变得越来越让人喜欢了。所以,我们团队开始尝试探索把我们庞大的项目实现oc和swift的混编。至于为什么不直接重构,那是因为实在是时间和事实不允许,毕竟我们的APP已经是好几年的庞然大物了。

        言归正传,我开始尝试着用swift来重写一个oc页面,看看难度如何,先趟趟坑再说。下面就是我自己遇到的一些小坑,总结如下。(纯代码开发,swift3.0)


1,关于桥接头文件的问题

      桥接头文件用来联系swift和oc文件,使swift能够调用oc的类,起到一个桥梁作用。

我们只需要在里面用  #import  包含需要用到的oc文件即可。比如:一个包含很多基础类的全局文件(#import "Define.h")、一些需要的第三方类库的头文件(#import "MJRefresh.h",#import "MJRefreshComponent.h")、一个你自己用oc定义的cell类、一个需要从当前页面跳入到的下一个oc类页面等。


2,oc中的宏定义在swift中怎么用

      最开始我也想怎么让它能在swift中直接调用的。可事实证明是行不通的。解决方法就是创建一个 import Foundation 的 swift文件,如下图:

    

包括一些色值宏定义、网络是否连接宏定义、toast提示宏定义等。当然,也包括接口宏定义。写完之后就可以在其他swift文件中直接用了,有点像oc里面那个pch文件。

       这是我觉得比较麻烦的一些地方,如果以后工程都用oc写的话,那辣么长辣么长的宏定义都要用swift重新定义一遍,而且名字最好还是有点区别。。想想就很麻烦。


3,swift文件初始化的问题
      开始先包含UIkit,然后在class 类名:“继承的父类”,“代理类” { 全部代码实现}

主题里面首先要写两个方法:


这两个方法是必须的,不然会报一些乱七八糟的错误。init方法里面初始化在init外面定义的属性(不论是let or var),当然也可以在定义时就初始化。但是需要注意的一点就是必须在super.init之前初始化。具体更详细的内容请看官网:The Swift Programming Language (Swift 3): Initialization

        swift的初始化问题还是有点意思的。


4,oc中怎么调用swift的类

        这个地方有两个小坑。首先,我们要在需要调用swift的类的地方包含#import "CaissaTouristic-Swift.h",这个是swift自动生成的一个文件,具体格式是:"本项目工程名-Swift.h",然后在需要的地方用你的swift文件类名调用就行了。

        我如果想用类名获取类怎么办呢,就像在oc里面一样。其实写法跟oc是一样的,只不过要在类名前面加个 "本项目工程名.",具体格式如:@"CaissaTouristic.SHolidayOrderListViewC"。

CaissaTouristic是我的项目名,SHolidayOrderListViewC是我的swift类名。


5,网络请求问题 json

因为我在基础类中已经包含了afnetworking和jsonkit类,所以可以直接拿来用,语法什么swift已经自行转变。网络请求直接用方法就行了,需要注意的一点是我用jsonString转换拼接参数(字典)的时候,提示我请求参数缺失,明明里面是有值的。打印出来是这个样子的:


又带optional又带\的,肯定不对。至于为什么带optional,请戳这里。那怎样去掉optional呢?

解决办法就是后面加!强制解包,即:args.jsonString()!,args是我的参数字典。


6,一些代码小问题()

      1,frame的初始化由cgrectmake(:::)变成了cgrect(x:y:width:height:)

      2,@selecter变成#selector

      3,注意 ?和 ! 的用法,感觉也是一个小宇宙,另开篇详写。

      4,错误提示expression resolves to an unused function

      如图,是我在用mj做列表上拉加载的时候调用结束刷新的方法,提示此错误

 

        原因分析:从字面就可以看出,它提示的错误信息是表达式返回的是一个没有使用的函数,我们只是简单的调用了它。这就是swift与oc不同的一点,swift要求使用 . 来调用方法,且方法名后边是必须加()的,同时这也是属性和方法的一点直观区别。

         解决方法:

        self.mainTableView.footer.endRefreshing()

       对于swift中的设计模式问题还没有做太多关注,这篇笔记只是记录在工程基本的写法和语法方面的一些实际小问题。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值