Swift与OC的相互调用
2021-12-20 本文已影响0人
萤火驻守心间
swift调用OC(底层是通过runtime调用_objc_msgSend来实现的)
如下图1-1、1-2 所示,创建person的oc类时(可选择xcode自动创建桥接文件,也可手动创建桥接文件并指定路径)
1、Xcode会自动帮我们生成Test(项目名)-Bridging-Header.h文件,并且会在Build Setting中指定桥接文件路径


2、在桥接文件中#import需要给swift使用的类

3、接下来在swift类中就可直接使用Person了
let person = Person()
person.name="hello"
person.run()
OC调用Swift
注意:被oc调用的swift类需要继承自NSObject, 比方说如果继承自NSProxy将消息转发到真正的target的代理类,就不能被oc调用
原因:在oc中的类是依赖runtime机制的,而runtime机制需要isa指针,只有继承NSObject才能获得isa指针
1、创建swift类并用@objc修饰想要暴露给oc的属性或方法,全部暴露可直接用@objcMembers修饰类


2、xcode默认生成了用于OC调用swift的头文件Test(项目名)-Swift.h,在oc类中#import引用即可

