注意事项

  1. oc不能继承Swift类,所以向oc项目中添加的Swift类不能包含oc的子类。
  2. Swift文件和.m不能重名。
  3. 继承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。
  • oc用Swift特有类型

有些数据类型、语法、特性是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,修饰类不能被继承。一般应用场景是:
  1. 类或者方法的功能确实已经完备了
  2. 避免子类继承和修改造成危险
  3. 为了让父类中某些代码一定会执行
2.数据类型选择

Swift的Struct是值类型,相比Class:
优点:

  1. 安全性:Struct用值类型传递,没有引用计数;值类型是自动线程安全的
  2. 内存:不会因为循环引用导致内存泄露
  3. 速度:值类型通常以栈的形式分配,读写比Class快
    缺点:
  4. 混编时,oc中无法调用Swift的Struct
  5. 继承:Struct不能继承
  6. NSUserDefaults:Struct不能被序列化成NSData

暂未解决的坑

  1. oc使用Swift特性的枚举
  2. Swift自动识别oc方法名重复

持续更新