iOS开发-OC混编Swift项目-全面实战各种坑

it2026-04-21  3

注意事项

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

2.数据类型选择

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

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

暂未解决的坑

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

持续更新

参考文章

https://blog.csdn.net/shubinniu/article/details/79239155 https://www.jianshu.com/p/97225a04a4b4 https://www.cnblogs.com/beckwang0912/p/8508299.html

最新回复(0)