Busqué algunas publicaciones, creo que no puedo escribir una extensión en Swift y llamarla desde el código Objective-C, ¿verdad?
¿Los atributos similares a @objc solo admiten métodos, clases, protocolos?
Busqué algunas publicaciones, creo que no puedo escribir una extensión en Swift y llamarla desde el código Objective-C, ¿verdad?
¿Los atributos similares a @objc solo admiten métodos, clases, protocolos?
Respuestas:
Puede escribir una extensión Swift y usarla en el código Objective-C. Probado con XCode 6.1.1.
Todo lo que necesitas hacer es:
crea tu extensión en Swift (sin @objc
anotaciones)
#import "ProjectTarget-Swift.h"
en su clase Objective-C (donde "ProjectTarget" representa el destino XCode con el que está asociada la extensión Swift)
llamar a los métodos desde la extensión Swift
Actualización: a
partir de @Rizwan Ahmed mencionado, debe agregar una @objc
anotación:
A partir de Swift 4.0.3, se necesita la anotación @objc si desea utilizar la extensión en los archivos de clase Objective C.
Descubrí que en Swift 4.0 tenía que agregar @objc
delante de mi palabra clave de extensión para que los métodos de extensión Swift fueran visibles por una instancia de la clase Objc que estaba extendiendo.
En breve:
Configuración de archivo de configuración:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
En CustomClassExtension:
@objc extension CustomClass
{
func method1()
{
...
}
}
En mi AppDelegate.m:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
anotación.
Esta solución funciona para Swift 2.2 y Swift 3 . Tenga en cuenta que solo las extensiones para clases (no para estructuras o enumeraciones) serán accesibles desde Objective-C.
import UIKit
extension UIColor {
//Custom colours
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
Luego, #importe "ProductModuleName-Swift.h" en su archivo ObjC.
Rápido 4
extension UIColor {
// As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
@objc
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
public
es necesario? Funciona bien sin public
modificador para mí. ¿Estamos asumiendo que la extensión no está en el mismo proyecto sino que se está importando de otro proyecto?
Como se explica en las otras respuestas, la importación del encabezado Swift generado funciona en la mayoría de los casos .
Una excepción a esto es cuando la categoría se define en un tipo puente (es decir, la extensión se define en String
y no NSString
). Estas categorías no se vincularán automáticamente con sus contrapartes de Objective-C. Para evitar esto, deberá usar el tipo Objective-C (y emitir el valor de retorno en su código Swift con as String
) o definir una extensión para los tipos Swift y Objective-C.
public extension NSString
. Si obtiene un identificador no resuelto o un error similar en el momento de la compilación, puede volver a let sVal = self as String
sVal
mclaughlinj
dijo, tanto para la clase NSString como para la estructura String