1.swift调用OC
在swift项目中OC的类, 新建1个桥接头文件,文件名格式默认为:{targetName}-Bridging-Header.h
如图:
这样,我们就可以调用Person里面的属性,方法等。
@interface Person : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,assign)NSInteger age;
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;
- (void)run;
+ (void)run;
@end
@implementation Person
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age
{
self = [super init];
if (self) {
self.name = name;
self.age = age;
}
return self;
}
- (void)run
{
NSLog(@"person -run");
}
+(void)run
{
NSLog(@"person +run");
}
//在swift文件中可以调用OC的类
var p = Person(name: "wwj", age: 25)
p.run()
Person.run()
2.OC调用swift
Xcode已经默认生成一个用于OC调用Swift的头文件,文件名格式是: {targetName}-Swift.h.
首先是swift文件,类需要继承NSObject。
如果是参数想被OC调用,就用@objc修饰,想全部都可以用@objcMembers。
@objcMembers class Person: NSObject {
var name: String
var age: Int
init(name:String,age:Int) {
self.name = name
self.age = age
}
func run() {
print("person -run")
}
static func run() {
print("Person +run")
}
}
在OC文件中导入#import "ObjectiveText-Swift.h"
#import "ObjectiveText-Swift.h"//在OC项目里面
Person *p = [[Person alloc] initWithName:@"wwj" age:25];
[p run];
[Person run];
🐷 为什么swift的类要继承NSObject,因为这个类是在OC里面调用的,走alloc init方法,run方法,走的是objc_msgSend的消息机制,必然需要isa指针,所以要继承NSObject。