swift从入门到精通21-Swift与OC互调

963 阅读1分钟

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。