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中的设计模式问题还没有做太多关注,这篇笔记只是记录在工程基本的写法和语法方面的一些实际小问题。