跨语言调用
一、Objective-C
OC调用Swift:
创建桥接文件
使用@objcMembers修饰的swift类可以被OC使用
@objcMembers class SwiftExample: NSObject {
@objc func OC_Call_Swift() {
print("oc call swift")
}
@objc static func OC_Call_Swift_static() {
print("oc call swift static")
}
@objc class func OC_Call_Swift_class() {
print("oc call swift class")
}
}
OC部分
#import "OCExample.h"
#import "Runner-Swift.h"
@implementation OCExample
- (void)OC_Call_Swift {
SwiftExample *swiftExample = [[SwiftExample alloc] init];
[swiftExample OC_Call_Swift];
[SwiftExample OC_Call_Swift_static];
[SwiftExample OC_Call_Swift_class];
}
@end
OC调用C和C++:
不需要桥接,可以直接调用
#ifndef CExample_h
#define CExample_h
#include <stdio.h>
void OC_Call_C(void);
#endif /* CExample_h */
#include "CExample.h"
void OC_Call_C(void) {
printf("oc call c");
}
#ifndef C_Example_hpp
#define C_Example_hpp
#include <stdio.h>
void OC_Call_C_(void);
#endif /* C_Example_hpp */
#include "C#Example.hpp"
void OC_Call_C_(void) {
printf("oc call c#");
}
#import "OCExample.h"
#import "CExample.h"
#import "C#Example.hpp"
@implementation OCExample
- (void)OC_Call_C {
OC_Call_C();
}
- (void)OC_Call_C_ {
OC_Call_C_();
}
@end
二、Swift
Swift调用OC
@interface OCExample : NSObject
+ (void)Swift_Call_OC_class;
- (void)Swift_Call_OC;
@end
#import "OCExample.h"
@implementation OCExample
+ (void)Swift_Call_OC_class {
NSLog(@"swift call oc class");
}
- (void)Swift_Call_OC {
NSLog(@"swift call oc");
}
@end
桥接文件中导入
#import "OCExample.h"
在Swift代码中
import Foundation
class SwiftExample {
func Swift_Call_OC() {
OCExample.swift_Call_OC_class();
OCExample().swift_Call_OC();
}
}
Swift调用C和C++
Swift不能直接调用C++代码,可以直接调用C代码,首先在桥接文件中导入
#include "CExample.h"
#ifndef CExample_h
#define CExample_h
#include <stdio.h>
void Swift_Call_C(void);
#endif
#include "CExample.h"
void Swift_Call_C(void) {
printf("swift call c");
}
class SwiftExample {
func S_Swift_Call_C() {
Swift_Call_C()
}
}
如果使用C和C++去调用是将Swift函数使用闭包接收,然后在桥接文件中extern,然后就可以在C和C++中调用;
若要使用C和C++去调用需要在.mm文件中使用对应的方法包装,不能够直接调用。
注:本文不考虑有使用第三方库的方法,所以未包含与JS、Dart等互相调用的情况,后续会持续更新。