Uso de clases de Objective-C en Swift
Si tiene una clase existente que le gustaría usar, realice el Paso 2 y luego salte al Paso 5 . (En algunos casos, tuve que agregar un #import <Foundation/Foundation.h
archivo explícito a un archivo Objective-C anterior).
Paso 1: Agregar implementación de Objective-C - .m
Agregue un .m
archivo a su clase y asígnele un nombre CustomObject.m
.
Paso 2: Agregar encabezado de puente
Al agregar su .m
archivo, es probable que reciba un mensaje similar al siguiente:

Haga clic en sí !
Si no vio el mensaje o borró accidentalmente su encabezado de puente, agregue un nuevo .h
archivo a su proyecto y asígnele un nombre <#YourProjectName#>-Bridging-Header.h
.
En algunas situaciones, particularmente cuando se trabaja con marcos Objective-C, no se agrega una clase Objective-C explícitamente y Xcode no puede encontrar el enlazador. En este caso, cree su .h
archivo nombrado como se mencionó anteriormente, luego asegúrese de vincular su ruta en la configuración del proyecto de destino de la siguiente manera:

Nota:
Es una buena práctica vincular su proyecto usando la $(SRCROOT)
macro para que si mueve su proyecto o trabaja con otros usando un repositorio remoto, todavía funcionará. $(SRCROOT)
puede considerarse como el directorio que contiene su archivo .xcodeproj. Podría verse así:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Paso 3: Agregue el encabezado Objective-C - .h
Agregue otro .h
archivo y asígnele un nombre CustomObject.h
.
Paso 4: construye tu clase Objective-C
En CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
En CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
Paso 5: Agregar clase al encabezado de puente
En YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Paso 6: usa tu objeto
En SomeSwiftFile.swift
:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
No hay necesidad de importar explícitamente; para eso sirve el encabezado de puente.
Usando clases rápidas en Objective-C
Paso 1: crear una nueva clase Swift
Agregue un .swift
archivo a su proyecto y asígnele un nombre MySwiftObject.swift
.
En MySwiftObject.swift
:
import Foundation
@objc(MySwiftObject)
class MySwiftObject : NSObject {
@objc
var someProperty: AnyObject = "Some Initializer Val" as NSString
init() {}
@objc
func someFunction(someArg: Any) -> NSString {
return "You sent me \(someArg)"
}
}
Paso 2: Importar archivos Swift a la clase ObjC
En SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
El archivo: <#YourProjectName#>-Swift.h
ya debe crearse automáticamente en su proyecto, incluso si no puede verlo.
Paso 3: usa tu clase
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];
NSLog(@"RetString: %@", retString);
Notas:
Si la finalización del código no se comporta como espera, intente ejecutar una compilación rápida ⌘⇧Rpara ayudar a Xcode a encontrar parte del código de Objective-C en un contexto Swift y viceversa.
Si agrega un .swift
archivo a un proyecto anterior y obtiene el error dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, intente reiniciar completamente Xcode .
Si bien originalmente era posible usar clases Swift puras (no descendientes de NSObject
) que son visibles para Objective-C usando el @objc
prefijo, esto ya no es posible. Ahora, para ser visible en Objective-C, el objeto Swift debe ser una clase conforme NSObjectProtocol
(la forma más fácil de hacerlo es heredar de NSObject
), o debe estar enum
marcado @objc
con un valor sin formato de algún tipo entero como Int
. Puede ver el historial de edición para un ejemplo de código Swift 1.x @objc
sin estas restricciones.