objective-c - ventajas - use swift class in objective c




Cómo llamar al código Objective-C desde Swift (10)

En el nuevo lenguaje Swift de Apple, ¿cómo se llama el código Objective-C?

Apple mencionó que podrían coexistir en una aplicación, pero ¿esto significa que uno podría reutilizar técnicamente las viejas clases creadas en Objective-C mientras construye nuevas clases en Swift?

El razonamiento

Objective-C es un lenguaje independiente de la plataforma, mientras que Swift depende de la plataforma. Por lo tanto, escribir código no dependiente de la plataforma (bibliotecas de lógica de negocios) en Swift no sería prudente. Sin embargo, escribir código dependiente de la plataforma en él (interfaz relacionada por ejemplo) sería perfectamente correcto. No quiere decir que sea una buena idea, sin embargo, es definitivamente un interés.


Usando 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 . (Para algunos casos, tuve que agregar un #import <Foundation/Foundation.h explícito a un archivo Objective-C más antiguo.) **

Paso 1: Agregar implementación de Objective-C - .m

Agregue un archivo .m a su clase y CustomObject.m nombre CustomObject.m .

Paso 2: Añadir encabezado puente

Cuando agregue su archivo .m , es probable que reciba un mensaje que se parece a esto:

Haga clic en !

Si no vio el indicador o borró accidentalmente el encabezado de puente, agregue un nuevo archivo .h a su proyecto y <#YourProjectName#>-Bridging-Header.h nombre <#YourProjectName#>-Bridging-Header.h .

En algunas situaciones, especialmente cuando se trabaja con marcos de Objective-C, no agrega una clase de Objective-C explícitamente y Xcode no puede encontrar el enlazador. En este caso, cree su archivo .h el nombre mencionado anteriormente, luego asegúrese de vincular su ruta en la configuración del proyecto de su objetivo de la siguiente manera:

Nota

Se $(SRCROOT) vincular su proyecto utilizando la macro $(SRCROOT) para que, si mueve su proyecto o trabaja en él con otros usuarios mediante un repositorio remoto, seguirá funcionando. $(SRCROOT) se puede considerar como el directorio que contiene su archivo .xcodeproj. Podría verse así:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

Paso 3: Añadir encabezado Objective-C - .h

Agregue otro archivo .h y CustomObject.h nombre CustomObject.h .

Paso 4: Construye tu clase de 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 a Bridging-Header

En YourProject-Bridging-Header.h :

#import "CustomObject.h"

Paso 6: Usa tu objeto

En SomeSwiftFile.swift :

var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

No hay necesidad de importar explícitamente; para eso es el encabezado puente.

Usando clases rápidas en Objective-C

Paso 1: Crear nueva clase Swift

Agregue un archivo .swift a su proyecto y MySwiftObject.swift nombre MySwiftObject.swift .

En MySwiftObject.swift :

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val"

    init() {}

    func someFunction(someArg:AnyObject) -> String {
        var returnVal = "You sent me \(someArg)"
        return returnVal
    }   
}

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 someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);

Nota:

1. CodeCompletion no se estaba comportando con tanta precisión como me gustaría. En mi sistema, ejecutar una compilación rápida con "cmd + r" pareció ayudar a Swift a encontrar parte del código de Objective-C y viceversa.

2. Si agrega un archivo .swift a un proyecto anterior y obtiene un error: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib , intente reiniciar completamente Xcode .

3. Aunque originalmente era posible usar clases Swift puras en Objective-C usando el prefijo @objc , después de Swift 2.0, esto ya no es posible. Ver historial de edición para la explicación original. Si esta funcionalidad se vuelve a habilitar en futuras versiones de Swift, la respuesta se actualizará en consecuencia.


Una cosa más que me gustaría añadir aquí:

Estoy muy agradecido a la respuesta de @Logan. Ayuda mucho crear un archivo de puente y configuraciones.

Pero después de hacer todos estos pasos todavía no consigo una clase de Objective-C en Swift.

cocoapods biblioteca de cocoapods y la cocoapods en mi proyecto. Que es pod "pop" .

Por lo tanto, si está utilizando los pods de Objective-C en Swift, es posible que no pueda obtener o import las clases en Swift.

Lo simple que tienes que hacer es:

  1. Vaya a <YOUR-PROJECT>-Bridging-Header file y
  2. Reemplace la declaración #import <ObjC_Framework> por @import ObjC_Framework

Por ejemplo: (biblioteca pop)

Reemplazar

#import <pop/POP.h>

con

@import pop;

Use clang import cuando #import no funciona.


Aquí hay instrucciones paso a paso para usar el código de Objective-C (en este caso, un marco provisto por un tercero) en un proyecto Swift:

  1. Agregue cualquier archivo de Objective-C a su proyecto Swift seleccionando Archivo -> Nuevo -> Nuevo archivo -> Archivo de Objective-C. Al guardar, Xcode le preguntará si desea agregar un encabezado puente . Elija ' '. Gif: agregar un archivo vacío al proyecto y generar el encabezado de puente http://www.derrrick.com//1-empty-file.gif

En simples pasos:

  1. Aparece un mensaje y luego hace clic en Aceptar ... Si no aparece, lo creamos manualmente como se muestra a continuación ... Crea un archivo de encabezado desde la fuente de iOS y ponemos el nombre ProjectName-Bridging-Header (ejemplo: Prueba -Bridging-Header), y luego vaya a la configuración de compilación en el código del compilador Swift -> Objective-C bridge agregue el nombre del puente Objective-C .. (Test / Test-Bridging-Header.h). Sí, eso es completo.

  2. Opcionalmente, elimine el archivo Objective-C que agregó (llamado "cualquier cosa" en la imagen GIF de arriba). No lo necesitas más.

  3. Abra el archivo de encabezado de puente : el nombre del archivo tiene la forma [YourProject] -Bridging-Header.h . Incluye un comentario provisto por Xcode. Agregue una línea de código para el archivo Objective-C que desea incluir , como un marco de terceros. Por ejemplo, para agregar Mixpanel a su proyecto, deberá agregar la siguiente línea de código al archivo de encabezado de puente:

    #import "Mixpanel.h"
  4. Ahora, en cualquier archivo Swift puede usar el código Objective-C existente, en la sintaxis Swift (en el caso de este ejemplo, y puede llamar a los métodos del SDK de Mixpanel, etc.). Debe familiarizarse con la forma en que Xcode traduce Objective-C a Swift. La guía de Apple es una lectura rápida. O vea esta respuesta para un resumen incompleto.

Ejemplo para Mixpanel:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

¡Eso es!

Nota: Si elimina el archivo de encabezado de puente de su proyecto , asegúrese de ir a Configuración de compilación y elimine el valor de " Cabecera de puente de Objective-C " en "Compilador de Swift - Generación de código".


Cita de la documentación :

Cualquier estructura Objective-C (o biblioteca C) a la que se pueda acceder como módulo se puede importar directamente en Swift. Esto incluye todos los marcos del sistema Objective-C, como Foundation, UIKit y SpriteKit, así como las bibliotecas comunes de C que se suministran con el sistema. Por ejemplo, para importar Foundation, simplemente agregue esta declaración de importación a la parte superior del archivo Swift en el que está trabajando:

import Foundation

Esta importación hace que todas las API de Foundation, incluidos NSDate, NSURL, NSMutableData y todos sus métodos, propiedades y categorías, estén disponibles directamente en Swift.


Cualquier estructura Objective-C (o biblioteca C) a la que se pueda acceder como módulo se puede importar directamente en Swift. Esto incluye todos los marcos del sistema Objective-C, como Foundation, UIKit y SpriteKit, así como las bibliotecas comunes de C que se suministran con el sistema. Por ejemplo, para importar Foundation, simplemente agregue esta declaración de importación a la parte superior del archivo Swift en el que está trabajando:

import Foundation

Esta importación hace que todas las API de Foundation, incluidos NSDate, NSURL, NSMutableData y todos sus métodos, propiedades y categorías, estén disponibles directamente en Swift.

He tomado esto de la documentación de Apple.


Después de crear un encabezado de enlace, vaya a Crear configuración => Buscar "Encabezado de enlace Objective-C".

Justo debajo encontrará el archivo "Nombre de encabezado de interfaz generado por Objective-C".

Importe ese archivo en su controlador de vista.

Ejemplo: En mi caso: "Dauble-Swift.h"


Haga clic en el menú Nuevo archivo y elija el idioma de selección de archivo Objetivo. En ese momento, genera automáticamente un archivo "Cabecera de puente de Objective-C" que se utiliza para definir el nombre de una clase.

"Cabecera puente de Objective-C" en "Compilador de Swift - Generación de código".


Puedes leer el bonito post Swift & Cocoapods . Básicamente, necesitamos crear un archivo de encabezado puente y poner todos los encabezados de Objective-C allí. Y luego necesitamos referenciarlo desde nuestra configuración de compilación. Después de eso, podemos usar el código Objective-C.

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

También eche un vistazo al documento de Apple Utilizando Swift con Cocoa y Objective-C también.



En el proyecto Swift 4.2 en Xcode 9.4 puede agregar fácilmente el archivo Objective-C. Siga los pasos a continuación para vincular el archivo Objective-C al proyecto Swift.

Step_01: Crea un nuevo proyecto de Xcode usando el lenguaje Swift:

File > New > Project > objc .

Step_02: En el proyecto Swift agrega un nuevo archivo Objective-C:

File > New > File... > macOS > Objective-C File .

Step_03: Si agrega un nuevo archivo Objective-C en el proyecto Swift por primera vez, Xcode le pregunta:

Would you like to configure an Objective-C bridging header ?

Step_04: Selecciona la opción:

Create Bridging Header .

Step_05: Se generará un archivo correspondiente con un nombre:

Objc-Bridging-Header.h .

Step_06: Ahora, necesita configurar la ruta del archivo Bridge en el encabezado del puente. En Project Navigator, haga clic en el proyecto con el nombre objc y luego elija:

Build Settings > Objective-C Bridging Header > Objc-Bridging-Header.h .

Step_07: Arrastre y suelte su Objc-Bridging-Header.h en ese cuadro para generar una ruta de archivo.

Step_08: Abra su Objc-Bridging-Header.h e importe el archivo Objective-C que desea usar en su archivo Swift.

#import "SpecialObjcFile.m"

Aquí hay un contenido de SpecialObjcFile.m :

#import <Foundation/Foundation.h>

@interface Person: NSObject {
@public
    bool busy;
}
@property
    bool busy;
@end

Step_09: Ahora en tu archivo Swift, puedes usar una clase de Objective-C:

override func viewDidLoad() {
    super.viewDidLoad()
    let myObjcContent = Person()
    print(myObjcContent.busy)
}





swift