ios - custom - framework swift
Marco de importaciĆ³n en Swift Project, Xcode (9)
Estoy tratando de importar myFramework
en un proyecto. He agregado myFramework
en Build Fhases-> Link Binary With Libraries.
Objective-c funciona:
#import <UIKit/UIKit.h>
#import <myFramework/myFramework.h>
Pero con Swift, No such module myFramework
error No such module myFramework
:
import UIKit
import myFramework
De acuerdo con la documentación de Swift :
Importación de marcos externos
Puede importar marcos externos que tengan una base de código Objective-C pura, una base de código Swift pura o una base de código de idioma mixto. El proceso para importar un marco externo es el mismo ya sea que el marco esté escrito en un solo idioma o contenga archivos de ambos idiomas. Cuando importe un marco de trabajo externo, asegúrese de que la configuración de creación de Definir módulo para el marco que está importando esté configurado en Sí.
Puede importar un marco en cualquier archivo Swift dentro de un destino diferente usando la siguiente sintaxis:
RÁPIDO
import FrameworkName
Puede importar un marco en cualquier archivo Objective-C .m dentro de un destino diferente usando la siguiente sintaxis:
C OBJETIVO
@import FrameworkName;
myFramework
usando Xcode 5. Xcode 5 no tiene una configuración de compilación "Define Module".
¿Dónde está el problema?
¡Simplemente el comando + B ayudaría!
El por qué: Agregar el marco a través de Cocoapods creará otro proyecto de módulo con los marcos requeridos. Para que el proyecto principal identifique los marcos, las bibliotecas estáticas de ambos proyectos deben puentearse. La construcción del espacio de trabajo es necesaria para que eso suceda.
De acuerdo con la documentación de Swift
Para importar código Objective-C a Swift desde el mismo destino
En su archivo de encabezado de puente de Objective-C, importe cada encabezado de Objective-C que desee exponer a Swift. Por ejemplo:
#import "XYZCustomCell.h"
#import "XYZCustomView.h"
#import "XYZCustomViewController.h"
En Configuraciones de compilación, asegúrese de que la configuración de compilación del Encabezado de puente de Objective-C en Swift Compiler - Generación de código tenga una ruta al encabezado. La ruta debe estar directamente en el archivo en sí, no en el directorio en el que se encuentra. La ruta debe ser relativa a su proyecto, similar a la forma en que su ruta de Info.plist se especifica en Configuración de compilación. En la mayoría de los casos, no debería necesitar modificar esta configuración.
Todos los encabezados públicos de Objective-C listados en este archivo de encabezado de puente serán visibles para Swift. La funcionalidad de Objective-C estará disponible en cualquier archivo Swift dentro de ese objetivo automáticamente, sin ninguna declaración de importación. Use su código Objective-C personalizado con la misma sintaxis Swift que usa con las clases del sistema.
let myCell = XYZCustomCell() myCell.subtitle = "A custom cell"
Además, asegúrese de que la configuración de creación "Definir módulo" en "Embalaje" esté configurada en "Sí".
De acuerdo, ahora es Xcode 7.2. Y lo que observé es que la importación rápida es sensible a mayúsculas y minúsculas. Ejemplo: import uikit
no funcionará. Tendrás que escribirlo como import UIKit
.
solo mis dos centavos.
El último XCode ofrece la opción de incorporar el marco en otros proyectos. Este enlace ( https://.com/a/37328591/1084174 ) funcionó bien para mí.
Puede importar marcos objC externos en proyectos rápidos usando la sintaxis siguiente:
#import "objCExternalFramework-name/headerfilename.h"
Si lo obtengo correctamente, no tiene un objetivo de compilación separado para su marco (ya lo creó con XCode 5) e incluyó el marco en el objetivo de compilación de su proyecto.
La parte de la documentación a la que se refiere es acerca de los marcos dentro de diferentes objetivos. Como su marco está en el objetivo del proyecto, esta parte de la documentación no se aplica aquí.
En su caso, no puede hacer una importación del marco en su archivo Swift. Es por eso que aparece el mensaje de error "No such module myFramework" . myFramework no es un módulo; es parte del módulo de tu proyecto (que está determinado por defecto por tu nombre de producto). Como tal, las clases en su marco deberían ser accesibles.
Sin embargo, su marco está escrito en Objective-C. Entonces, lo que tiene que hacer es importar las clases enfrentadas de Swift en su encabezado de puente tal como se describe here .
Tenga en cuenta que esto no tiene nada que ver con la importación Swift de un módulo. La directiva de importación en el archivo de encabezado de puente simplemente notifica al compilador que ''traduzca'' los archivos de encabezado Objective-C a la sintaxis Swift y hace que el encabezado público sea visible para Swift.
Entonces, ¿qué deberías hacer ahora?
Primero importe los archivos de encabezado que le interesan en el encabezado de puente. Solo necesita importar los encabezados con los que interactuará en Swift.
Intenta compilar tu proyecto en esta etapa. Si XCode no puede encontrar los archivos de encabezado de la infraestructura, su problema probablemente no esté relacionado con Swift o XCode 6, pero sí un problema con la inclusión de marcos en general.
- Después de eso, intenta crear una instancia de una clase que importaste en el encabezado de puente, tal vez en tu AppDelegate.swift. La autocompleción de XCode debería ofrecerle los nombres de los tipos.
Espero que esto ayude.
Sigue los pasos aquí:
Y luego ve aquí:
Video de Youtube sobre la creación de marcos
Presta atención:
Asegúrese de configurar la "Membresía de destino" de los encabezados para que todos sean iguales (el proyecto debería estar bien).
necesita en su proyecto objetivo c un encabezado público con el mismo nombre de su aplicación, en su caso FrameworkName.h y agregue todas las clases que desea exponer (esas clases se deben agregar como encabezado público en las propiedades del proyecto) Una vez que hazlo, agregas el marco y agregas la referencia a tu cabecera pública import FrameworkName
En Swift:
Crear Framework: -
Inicie Xcode -> Cree un nuevo Proyecto Xcode -> iOS -> Framework & Library -> Cocoa Touch Framework -> Nombre el framework (ej. SampleCocoaFramework) -> Create.
Establezca Taget -> General -> Información de implementación -> Destino de despliegue.
Agregue una clase pública: Archivo -> Nuevo archivo -> iOS -> Swift File -> Name it (por ejemplo, openCocoaClass) -> Create.
Ahora agrega un código al openCocoaClass.swift.
import Foundation public class openCocoaClass { public init() { } public var samplePublicVariable = "samplePublicVariable @ openCocoaClass" public func samplePublicFunction() { print("samplePublicFunction @ openCocoaClass") }
}
Limpie el proyecto: Producto -> Limpio
Configure los ajustes del esquema: Producto -> Esquema -> Editar esquema -> Ejecutar -> Configuración de compilación -> Versión.
Construya el marco: Producto -> Construir.
- Exporte el marco: Productos -> Seleccione el marco -> Identidad y tipo -> Ruta completa -> Marco liberado.
Agregar Framework al Proyecto: -
Comience un proyecto Xcode y asígnele un nombre (por ejemplo, CocoaFrameworkTest).
Arrastre y suelte el marco sampleCocoaFramework.framework en la carpeta del proyecto CocoaFrameworkTest.
Objetivo -> General -> Incrustar binarios -> Agregar otro -> Seleccionar marco -> Copiar elementos si es necesario -> Listo.
Accediendo al Framework en ViewController: -
import UIKit
import sampleCocoaFramework
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let frameworkObject = openCocoaClass.init()
frameworkObject.samplePublicFunction()
print(frameworkObject.samplePublicVariable)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}