swift 混编
注意事项
- oc不能继承Swift类,所以向oc项目中添加的Swift类不能包含oc的子类。
- Swift文件和.m不能重名。
- 继承oc的类的Swift类才能在oc中使用。
编译场景问题
用oc新建的iOS项目,在swift文件中默认使用release编译场景,
如果需要用到debug,需要在
Build Settings-Swift
Compiler-Active
Compilation Conditions添加DEBUG
或者在OTHER_SWIFT_FLAGS中添加-DDEBUG。
也可以新增其他的编译场景。
互相调用问题
oc和Swift文件默认不能互相调用
Swift调用oc的文件:
在xxxx-Bridging-Header.h文件中引用oc头文件。
在oc项目中创建第一个swift文件时会提示自动添加桥接文件,如果不小心选择了否,可以按这个命名自行添加,然后在Objective-C Bridging Header中配置正确的地址。
oc调用Swift的文件:
在相应.m中引用#import “xxxx-Swift.h”,其中xxxx是Build Settings中的Product Module Name。
添加此文件后,可以使用Swift类,如果要使用其中的方法和属性,需要在相应方法和属性前添加@objc;或者在class声明前添加@objcMembers。
有些数据类型、语法、特性是Swift特有。
比如Swift的枚举,oc不能识别
这时要将类标记为@objc(Xxxx)
提示:
Method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C
这时要在使用到Swift中枚举声明前添加@objc。
而成员变量为字符串类型时,添加@objc也无法使用。
oc迁移Swift
1.属性和方法权限
- oc中a类要暴露给b类调用的方法和属性,放在.h中即可,在.m扩展和本类实现中的方法和属性则无法被a类调用。
- swift中的属性和方法默认的权限等级与oc不同,所以要分清权限关键字的区别,以更好地完成业务需要。
- Internal。默认权限。在模块内部可以被其他文件或类使用,超出模块内部不可被访问。
- private:其修饰的属性或者方法只允许在当前类所在源文件中调用,修饰的方法不可以被代码域之外的地方访问 ,包括子类和同文件里的其他类。本类源码文件的extension除外。
- fileprivate:其修饰的属性或者方法只能在当前的 Swift 源文件里可以访问,即在同一个文件中,所有的 fileprivate 方法属性都是可以访问到的。
- public:其修饰的属性或者方法可以在其他作用域被访问 但不能在重载 override 中被访问 也不能在继承方法中的 Extension 中被访问
- open:open是为了弥补public语义上的不足。现在的pubic有两层含义:
- 这个元素可以在其他作用域被访问
- 这个元素可以在其他作用域被继承或者override
- 而open意思是在其他module中只能被访问,不能被override
- final:修饰方法不能被override,修饰类不能被继承。一般应用场景是:
- 类或者方法的功能确实已经完备了
- 避免子类继承和修改造成危险
- 为了让父类中某些代码一定会执行
2.数据类型选择
Swift的Struct是值类型,相比Class:
优点:
- 安全性:Struct用值类型传递,没有引用计数;值类型是自动线程安全的
- 内存:不会因为循环引用导致内存泄露
- 速度:值类型通常以栈的形式分配,读写比Class快
缺点:
- 混编时,oc中无法调用Swift的Struct
- 继承:Struct不能继承
- NSUserDefaults:Struct不能被序列化成NSData