下文以O(shè)C項(xiàng)目為基礎(chǔ)進(jìn)行說(shuō)明
一纫版、在同一個(gè)Target
中Objective-C
訪問(wèn)Swift
代碼
1.需要導(dǎo)入
Swift
的頭文件#import "xxx-Swift.h"
胳挎,xxxx
表示項(xiàng)目名稱,如果項(xiàng)目名稱中包含-
迅细,則需要轉(zhuǎn)換為_
巫橄。2.Swift中定義的類class:類本身需繼承自NSObject類,且函數(shù)使用@objc修飾茵典、屬性使用@objc修飾湘换,否則不能被OC訪問(wèn)。
定義類统阿、函數(shù)彩倚、屬性
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中定義的協(xié)議protocol:協(xié)議本身需要使用@objc修飾。(無(wú)論是否遵循NSObjectProtocol協(xié)議均可)
定義協(xié)議
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中定義的結(jié)構(gòu)體:OC中不能調(diào)用Swift中定義結(jié)構(gòu)體帆离。(不支持用@objc修飾)。解決方案:定義一個(gè)類结澄,將swift結(jié)構(gòu)體的值轉(zhuǎn)換為class給OC用哥谷。
- 6.Swift中定義的類、協(xié)議概而、枚舉在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.注意事項(xiàng):
Swift中的可選類型呼巷、非可選類型對(duì)應(yīng)OC中_Nullable囱修、_Nonnull赎瑰。
二、在同一個(gè)Target
中Swift
訪問(wèn)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
訪問(wèn)結(jié)果: