下文以OC项目为基础进行说明
一、在同一个Target
中Objective-C
访问Swift
代码
1.需要导入
Swift
的头文件#import "xxx-Swift.h"
,xxxx
表示项目名称,如果项目名称中包含-
,则需要转换为_
。2.Swift中定义的类class:类本身需继承自NSObject类,且函数使用@objc修饰、属性使用@objc修饰,否则不能被OC访问。
定义类、函数、属性
class EMMDSwiftClass { /*未继承自NSObject*/
var string1 = ""
@objc var string2 = ""
func func1(){}
@objc func func2(){}
}
class EMMDSwiftNSObjectClass: NSObject {
var string1 = "" /*未使用@objc修饰*/
@objc var string2 = ""
func func1(){}/*未使用@objc修饰*/
@objc func func2(){}
static func func3(){}/*未使用@objc修饰*/
@objc static func func4(){}
}
- (void)test{
//EMMDSwiftClass *swiftClass = [[EMMDSwiftClass alloc] init];//非继承NSObject的类
EMMDSwiftNSObjectClass *swiftNSObjectClass = [[EMMDSwiftNSObjectClass alloc] init];
//[swiftNSObjectClass func1];//未使用objc修饰
[swiftNSObjectClass func2];
//[EMMDSwiftNSObjectClass func3];//未使用objc修饰
[EMMDSwiftNSObjectClass func4];
//swiftNSObjectClass.string1 = @"88888";//未使用objc修饰
swiftNSObjectClass.string2 = @"88888";
}
- 3.Swift中定义的协议protocol:协议本身需要使用@objc修饰。(无论是否遵循NSObjectProtocol协议均可)
定义协议
protocol EMMDSwiftProtocol {
func run();
}
@objc protocol EMMDSwiftObjcProtocol {
func run();
}
protocol EMMDSwiftNSObjectProtocol : NSObjectProtocol {
func run();
}
@objc protocol EMMDSwiftObjcNSObjectProtocol : NSObjectProtocol {
func run();
}
- 4.Swift中定义的枚举enum:需要枚举本身是int类型(Int8, Int16, Int32, Int64, Int), 且枚举使用@objc修饰。
定义枚举
enum EMMDSwiftColorType: Int {
case red = 0
case green
case blue
}
@objc enum EMMDSwiftObjcColorType: Int16 {
case red = 0
case green
case blue
}
- 5.Swift中定义的结构体:OC中不能调用Swift中定义结构体。(不支持用@objc修饰)。解决方案:定义一个类,将swift结构体的值转换为class给OC用。
- 6.Swift中定义的类、协议、枚举在iOSApp_Objective_C-Swift中信息:
@interface EMMDSwiftNSObjectClass : NSObject
@property (nonatomic, copy) NSString * _Nonnull string2;
- (void)func2;
+ (void)func4;
- (void)test;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
typedef SWIFT_ENUM(int16_t, EMMDSwiftObjcColorType, closed) {
EMMDSwiftObjcColorTypeRed = 0,
EMMDSwiftObjcColorTypeGreen = 1,
EMMDSwiftObjcColorTypeBlue = 2,
};
SWIFT_PROTOCOL("_TtP18iOSApp_Objective_C29EMMDSwiftObjcNSObjectProtocol_")
@protocol EMMDSwiftObjcNSObjectProtocol <NSObject>
- (void)run;
@end
SWIFT_PROTOCOL("_TtP18iOSApp_Objective_C21EMMDSwiftObjcProtocol_")
@protocol EMMDSwiftObjcProtocol
- (void)run;
@end
- 7.注意事项:
Swift中的可选类型、非可选类型对应OC中_Nullable、_Nonnull。
二、在同一个Target
中Swift
访问Objective-C
代码
- 1.需要
Objective-C
类import到xxxx-Bridging-Header.h
中。
@interface EMMDObjectiveCClass : NSObject
- (void)instanceMethod;
+ (void)classMethod;
@property (nonatomic, strong) NSMutableArray *modules;
@property (nonatomic, copy, class) NSString *name;
@end
@implementation EMMDObjectiveCClass
- (void)instanceMethod{
NSLog(@"%s", __func__);
}
+ (void)classMethod{
NSLog(@"%s", __func__);
}
+ (NSString *)name {
return @"";
}
+ (void)setName:(NSString *)name {
}
@end
访问结果: