Tabla de contenido
versión
Xcode 11.3.1
Swift 5.1.3
Swift llama a Objective-C
Cree un nuevo proyecto Swift y luego cree un nuevo archivo Objective-C, y luego aparecerá un mensaje de archivo de conector de puente (si no es un archivo nuevo, sin este mensaje, podemos crearlo nosotros mismos, como se describe más adelante). :
Créelo, y luego habrá más archivos de encabezados:
Person.h :
@interface Person : NSObject
- (void)sayHello;
@end
Persona.m:
#import "Person.h"
@implementation Person
- (void)sayHello {
printf("Person say hello\n");
}
@end
Cite el archivo de encabezado OC en el archivo SwiftAndOC-Bridging-Header.h:
#import "Person.h"
Primero compile con ⌘ + B, y luego puede hacer referencia al objeto OC en ViewController.swift:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let person = Person()
person.sayHello()
}
}
Ejecútelo e imprima:
Person say hello
Objective-C llamar a Swift
Cree un nuevo archivo Cat.swift:
import UIKit
class Cat: NSObject {
@objc func sayHello() {
// @objc的作用后文介绍
print("Cat say hello")
}
}
Primero compila ⌘ + B, y luego queremos llamarlo en Person.m, necesitamos introducir el archivo de encabezado 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 es un archivo creado por el sistema y se presentará más adelante.
Ejecútelo e imprima:
Person say hello
Cat say hello
Análisis simple
1. XXX-Bridging-Header.h
Cuando necesitamos citar OC en Swift, necesitamos importar el archivo .h de OC en el archivo puente de XXX-Bridging-Header.h.
Si no es un archivo OC nuevo, el sistema no nos ayudará a crear el archivo puente, entonces necesitamos crear el archivo puente manualmente.
crear un nuevo archivo:
Luego, asígnele el nombre XXX-Bridging-Header.h (XXX es generalmente el nombre de su proyecto). Complete el nombre del archivo que acaba de crear en la columna Encabezado puente de Objective-C en TARGETS:
2. XXX-Swift.h
Cuando necesitamos citar Swift en OC, necesitamos importar el archivo XXX-Swift.h.
Y este archivo lo crea el sistema para nosotros. En la siguiente columna de nuestro archivo puente autoconstruido en la imagen de arriba, hay un SwiftAndOC-Swift.h, este archivo lo crea el sistema para nosotros y no necesitamos cambiar este archivo. Podemos mantener presionada la tecla then y luego hacer clic en este archivo para ver el contenido que contiene.
Puede ver que la persona de la clase OC original se ha convertido en un tipo Swift:
SWIFT_CLASS("_TtC10SwiftAndOC3Cat")
@interface Cat : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
Pero en este momento no existe el método sayHello. También necesitamos agregar la palabra clave @objc delante de la función Swift referenciada:
class Cat: NSObject {
@objc func sayHello() {
print("Cat say hello")
}
}
De esta forma, la función Swift original se transforma en el método OC en XXX-Swift.h. Verifique XXX-Swift.h nuevamente después de la compilación:
SWIFT_CLASS("_TtC10SwiftAndOC3Cat")
@interface Cat : NSObject
- (void)sayHello;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
Ahora, entendemos por qué lo compilamos antes de hacer referencia a los demás. Porque solo después de la compilación, el sistema dará un mensaje de asociación cuando escribamos el código: