バージョン
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列に作成したファイルの名前を入力します。
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
これで、相互に参照する前にコンパイルした理由がわかりました。コンパイル後にのみ、コードを記述したときにシステムが関連付けプロンプトを表示するためです。