Swift for iOS Development(15)-SwiftとObjective-Cの混合

バージョン

Xcode 11.3.1
Swift 5.1.3

SwiftがObjective-Cを呼び出す

新しいSwiftプロジェクトを作成してから、新しいObjective-Cファイルを作成すると、ブリッジコネクタファイルプロンプトが表示されます(新しいファイルでない場合は、このプロンプトがなくても、後で説明するように、自分で作成できます)。 :
ブリッジジョイントファイルを作成する
それを作成すると、さらにヘッダーファイルが作成されます:
目次

Person.h:

@interface Person : NSObject

- (void)sayHello;

@end

Person.m:

#import "Person.h"

@implementation Person

- (void)sayHello {
    
    
    printf("Person say hello\n");
}

@end

SwiftAndOC-Bridging-Header.hファイルのOCヘッダーファイルを引用します。

#import "Person.h"

最初に⌘+ Bでコンパイルしてから、ViewController.swiftでOCオブジェクトを参照できます。

import UIKit

class ViewController: UIViewController {
    
    

    override func viewDidLoad() {
    
    
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let person = Person()
        person.sayHello()
    }

}

それを実行して印刷します:

Person say hello

Objective-CはSwiftを呼び出します

新しいCat.swiftファイルを作成します。

import UIKit

class Cat: NSObject {
    
    

    @objc func sayHello() {
    
        // @objc的作用后文介绍
        print("Cat say hello")
    }
}

最初に⌘+ Bをコンパイルし、次にそれをPerson.mで呼び出したいので、SwiftAndOC-Swift.hヘッダーファイルを導入する必要があります。

#import "Person.h"
#import "SwiftAndOC-Swift.h"

@implementation Person

- (void)sayHello {
    
    
    printf("Person say hello\n");
    
    Cat *cat = [[Cat alloc] init];
    [cat sayHello];
}

@end

SwiftAndOC-Swift.hはシステムによって作成されたファイルであり、後で導入されます。

それを実行して印刷します:

Person say hello
Cat say hello

簡単な分析

1. XXX-Bridging-Header.h
SwiftでOCを引用する必要がある場合、OCの.hファイルをXXX-Bridging-Header.hのブリッジファイルにインポートする必要があります。
新しいOCファイルでない場合、システムはブリッジファイルの作成を支援しません。その場合、ブリッジファイルを手動で作成する必要があります。
新しいファイルを作成します。
ヘッダーファイルを作成する

次に、XXX-Bridging-Header.hという名前を付けます(通常、XXXはプロジェクト名です)。TARGETSのObjective-CBridgingHeader列に作成したファイルの名前を入力します。
関連するブリッジfile.png

2. XXX-Swift.h
OCでSwiftを引用する必要がある場合は、XXX-Swift.hファイルをインポートする必要があります。
そして、このファイルは私たちのためにシステムによって作成されます。上の写真の自己構築ブリッジファイルの次の列には、SwiftAndOC-Swift.hがあります。このファイルはシステムによって作成されたものであり、このファイルを変更する必要はありません。⌘を押しながらこのファイルをクリックすると、中のコンテンツが表示されます。
元のOCクラスPersonがSwift型に変換されていることがわかります。

SWIFT_CLASS("_TtC10SwiftAndOC3Cat")
@interface Cat : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

ただし、現時点では、sayHelloメソッドはありません。また、参照されるSwift関数の前にキーワード@objcを追加する必要があります。

class Cat: NSObject {
    
    

    @objc func sayHello() {
    
    
        print("Cat say hello")
    }
}

このようにして、元のSwift関数はXXX-Swift.hのOCメソッドに変換されます。コンパイル後にXXX-Swift.hを再度確認してください。

SWIFT_CLASS("_TtC10SwiftAndOC3Cat")
@interface Cat : NSObject
- (void)sayHello;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

これで、相互に参照する前にコンパイルした理由がわかりました。コンパイル後にのみ、コードを記述したときにシステムが関連付けプロンプトを表示するためです。
アソシエーションprompt.png

おすすめ

転載: blog.csdn.net/u012078168/article/details/104653540