No se pueden usar clases Swift dentro de Objective-C
Intento integrar Swift
código en mi aplicación. Mi aplicación está escrita Objective-C
y agregué una Swift
clase. He hecho todo lo que se describe aquí . Pero mi problema es que Xcode
no he creado el -Swift.h
archivo, solo los encabezados puente. Entonces lo creé, pero en realidad está vacío. Puedo usar todas mis clases de ObjC en Swift, pero no puedo hacerlo al revés. Marqué mi clase rápida con @objc
pero no ayudó. ¿Qué puedo hacer ahora?
EDITAR: Apple dice:" Cuando importa código Swift a Objective-C, confía en un Xcode-generated
archivo de encabezado para exponer esos archivos a Objective-C. [...] El nombre de este encabezado es el nombre del módulo de su producto seguido de la adición " -Swift.h”. "
Ahora cuando quiero importar ese archivo, me da un error:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
Aquí está mi archivo FBManager.swift:
@objc class FBManager: NSObject {
var descr = "FBManager class"
init() {
super.init()
}
func desc(){
println(descr)
}
func getSharedGameState() -> GameState{
return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
}
}
Pasé aproximadamente 4 horas intentando habilitarlo Swift
en mi Xcode
proyecto basado en Objective-C. Mi myproject-Swift.h
archivo se creó correctamente, pero Xcode
no vi mi archivo Swift-classes
. Entonces, decidí crear un nuevo Xcode
proyecto basado en Objc y finalmente encontré la respuesta correcta. Espero que esta publicación ayude a alguien :-)
Integración Swift paso a paso para proyectos basados en Xcode Objc:
- Cree un nuevo
*.swift
archivo (en Xcode) o agréguelo usando Finder. - Crea un
Objective-C bridging header
cuando Xcode te pregunte sobre eso. Implemente su clase Swift:
import Foundation // use @objc or @objcMembers annotation if necessary class Foo { //.. }
Abra Configuración de compilación y verifique estos parámetros:
- Define el módulo:
YES
Copiar y pegar el nombre del parámetro en una barra de búsqueda
- Nombre del módulo del producto:
myproject
Asegúrese de que el nombre del módulo de su producto no contenga ningún carácter especial.
- Instalar el encabezado de compatibilidad de Objective-C:
YES
Una vez que haya agregado
*.swift
el archivo al proyecto, esta propiedad aparecerá en Configuración de compilación - Encabezado de interfaz generado por Objective-C:
myproject-Swift.h
Este encabezado es generado automáticamente por Xcode
- Encabezado de puente Objective-C:
$(SRCROOT)/myproject-Bridging-Header.h
- Define el módulo:
Importe el encabezado de la interfaz Swift en su archivo *.m.
#import "myproject-Swift.h"
No prestes atención a errores y advertencias.
- Limpia y reconstruye tu proyecto Xcode.
- ¡Ganancia!
No cree el archivo de encabezado usted mismo. Elimina el que creaste.
Asegúrese de que sus clases Swift estén etiquetadas @objc
o hereden de una clase que derive (directa o indirectamente) de NSObject
.
Xcode no generará el archivo si tiene algún error de compilación en su proyecto; asegúrese de que su proyecto se genere limpiamente.