Pregunta Cómo llamar a código Objective-C de Swift


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

Apple mencionó que podrían coexistir en una aplicación, pero ¿esto significa que técnicamente podría reutilizarse las clases antiguas creadas en Objective-C mientras se crean nuevas clases en Swift?

El razonamiento

Objective-C es un lenguaje independiente de plataforma, mientras que Swift depende de la plataforma. Escribir un código que no dependa de la plataforma (bibliotecas de lógica de negocios) en Swift no sería, pues, inteligente. Sin embargo, escribir en él código dependiente de la plataforma (relacionado con la interfaz, por ejemplo) estaría perfectamente bien. No decir que sería una buena idea, sin embargo, definitivamente es un interés.


818
2018-06-02 20:05


origen


Respuestas:


 Usar clases Objective-C en Swift

** Si tiene una clase existente que le gustaría usar, realice Paso 2 y luego salte a Paso 5. (Para algunos casos, tuve que agregar un explícito #import <Foundation/Foundation.h a un archivo Objective-C más antiguo). **

 Paso 1: Agregue la Implementación de Objective-C - .m

Agrega un .m archivo a su clase, y asígnele el nombre CustomObject.m.

 Paso 2: agregar encabezado de puente

Al agregar su .m archivo, es probable que aparezca un mensaje que se vea así:

Enter image description here

Hacer clic  SÍ !

Si no vio el mensaje, o borró accidentalmente su encabezado de puente, agregue un nuevo .h archivo a su proyecto y asígnele el 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, crea tu .h archivo nombrado como se mencionó anteriormente, luego asegúrese de vincular su ruta en la configuración del proyecto de su destino de la siguiente manera:

Enter image description here

Nota

Es una buena práctica vincular su proyecto usando el $(SRCROOT) macro, de modo que si mueve su proyecto o lo trabaja con otros utilizando un repositorio remoto, seguirá funcionando. $(SRCROOT) se puede considerar como el directorio que contiene su archivo .xcodeproj. Puede verse así:

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

 Paso 3: agrega el encabezado Objective-C - .h

Agrega otro .h archivar y nombrarlo 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 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 de puente.

 Usar clases Swift en Objective-C

 Paso 1: Crea una nueva clase Swift

Agrega un .swift archivo a su proyecto, y asígnele el 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: Importa archivos Swift a la clase ObjC

En SomeRandomClass.m:

#import "<#YourProjectName#>-Swift.h"

El archivo:<#YourProjectName#>-Swift.h ya debe ser creado 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 comportaba con la precisión que me gustaría. En mi sistema, ejecutar una compilación rápida con "cmd + r" pareció ayudar a Swift a encontrar algo del código Objective-C y viceversa.

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

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


1212
2018-06-03 00:12



Vea la guía de Apple para Usando Swift con Cocoa y Objective-C. Esta guía cubre cómo usar el código Objective-C y C de Swift y viceversa y tiene recomendaciones sobre cómo convertir un proyecto o mezclar y unir piezas de Objective-C / C y Swift en un proyecto existente.

El compilador genera automáticamente la sintaxis Swift para llamar a las funciones C y los métodos Objective-C. Como se ve en la documentación, este Objective-C:

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

se convierte en este código Swift:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

Xcode también hace esta traducción sobre la marcha: puede usar Open Quickly mientras edita un archivo Swift y escribe un nombre de clase Objective-C, y lo llevará a una versión Swift-ified del encabezado de clase. (También puede obtener esto haciendo clic con el botón cmd en un símbolo de API en un archivo Swift). Y toda la documentación de referencia de API en el iOS 8 y OS X v10.10 (Yosemite) las bibliotecas de desarrollador son visibles en ambos formularios Objective-C y Swift (p. UIView)


101
2018-06-02 20:43



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

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

En simples pasos:

  1. Aparecerá un mensaje, y luego haga clic en Aceptar ... Si no aparece, entonces lo creamos manualmente como se muestra a continuación ... Cree un archivo de encabezado desde el origen de iOS y dé el nombre ProjectName-Bridging-Header (ejemplo: Prueba -Bridging-Header), y luego ir a la configuración de compilación en el código del compilador Swift -> Objective-C bridge agregar el nombre del puente Objective-C .. (Test / Test-Bridging-Header.h). Sí, eso está completo.

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

  3. Abra el archivo de encabezado de puente - el nombre del archivo es de la forma [YourProject] -Bridging-Header.h. Incluye un comentario proporcionado 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 puedes usa el código Objective-C existente, en la sintaxis de Swift (en el caso de este ejemplo, y puede llamar a los métodos de Mixknel SDK, etc.). Necesita familiarizarse con la forma en que Xcode traduce Objective-C a Swift. 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 entrar en Configuración de compilación y elimine el valor de "Encabezado de puente de Objective-C"en" Swift Compiler - Code Generation ".


49
2018-02-12 19:34



Puedes leer la buena publicación Swift y Cocoapods. Básicamente, tenemos que crear un archivo de encabezado de 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 Usando Swift con Cocoa y Objective-C también.


30
2018-06-04 02:11



Escribí un proyecto simple de Xcode 6 que muestra cómo mezclar código C ++, Objective-C y Swift:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

En particular, el ejemplo llama una función Objective-C y una función C ++ del Swift.

La clave es crear un encabezado compartido, Project-Bridging-Header.h, y colocar allí los encabezados Objective-C.

Descargue el proyecto como un ejemplo completo.


19
2018-06-13 10:10



Cita de la documentación:

Cualquier marco de Objective-C (o biblioteca de C) que sea accesible como un 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 suministradas con el sistema. por   ejemplo, para importar Foundation, simplemente agregue esta declaración de importación al   la parte superior del archivo Swift en el que estás trabajando:

import Foundation

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


17
2018-06-02 20:43



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

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

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

Usé el cocoapods biblioteca y lo integró en mi proyecto. Cual es pod "pop".

Entonces, si está usando pods de Objective-C en Swift, entonces puede haber una posibilidad de que no pueda obtener o import las clases en Swift.

Lo simple que tienes que hacer es:

  1. Ir <YOUR-PROJECT>-Bridging-Header archivo y
  2. Reemplazar la declaración #import <ObjC_Framework> a @import ObjC_Framework

Por ejemplo: (Biblioteca pop)

Reemplazar

#import <pop/POP.h>

con

@import pop;

Utilizar clang import cuando #import no está trabajando.


15
2017-09-16 07:00



Solo una nota para quien intente agregar una biblioteca Objective-C a Swift: debe agregar -ObjC en Configuración de compilación -> Enlace -> Otras banderas enlazadoras.


7
2018-03-20 17:53



Después de crear un encabezado Bridging, vaya a Build Setting => Buscar "Objective-C Bridging Header".

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

Importe ese archivo en su controlador de vista.

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

eEter image description here


3
2017-11-25 08:29