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

2.数据类型选择

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

优点:

  • 安全性:Struct用值类型传递,没有引用计数;值类型是自动线程安全的
  • 内存:不会因为循环引用导致内存泄露
  • 速度:值类型通常以栈的形式分配,读写比Class快

缺点:

  • 混编时,oc中无法调用Swift的Struct
  • 继承:Struct不能继承
  • NSUserDefaults:Struct不能被序列化成NSData
posted @ 2022-10-13 09:28  Alerson  阅读(173)  评论(0编辑  收藏  举报