ios objective-c swift generics

ios - Usando una clase genérica Swift en Objective-C



generics (2)

Existe una solución para algunas situaciones, cuando necesita importar la clase genérica Swift en Objective-C.

Digamos que tiene el servicio REST de Swift, que utiliza Genéricos. Estoy usando el framework Moya y así es como se ve mi servicio:

class AuthService: BaseService<AuthAPI> { func register(email: String) { // ... } }

Se hereda del servicio base mediante genéricos, por lo que no puedo usarlo directamente en mi código de Objective-C.

Así que aquí hay una solución:

Permite crear AuthServiceProtocol :

@objc protocol AuthServiceProtocol { func register(email: String) }

Entonces, vamos a crear una fábrica para el servicio (o un método de singleton, sin diferencia):

@objc class Services: NSObject { static let authService: AuthServiceProtocol = AuthService() }

Entonces puedo llamar a mi servicio de autenticación Swift genérico desde el código de Objective-C:

- (void)someObjcMethod { [Services.authService registerWithEmail:self.email]; }

Digamos que defino una clase genérica en Swift, similar a la siguiente:

class MyArray<T> { func addObject(object: T) { // do something... hopefully } }

(Sé que hay una implementación ligeramente mejor de la matriz, esto es simplemente un ejemplo).

En Swift ahora puedo usar esta clase muy fácilmente:

let a = MyArray<String>() a.addObject("abc")

Con Xcode 7, ahora tenemos genéricos en Objective-C , así que asumo que podría usar esta clase en Objective-C:

MyArray<NSString*> *a = [[MyArray<NSString*> alloc] init]; [a addObject:@"abc"];

Sin embargo, MyArray nunca se agrega a mi archivo Project-Swift.h . Incluso si lo cambio para heredar de NSObject, todavía no aparece en mi archivo Swift.h.

¿Hay alguna forma de crear una clase Swift genérica y luego usarla en Objective-C?

Actualización: si intento heredar de NSObject y anotar con @objc:

@objc(MyArray) class MyArray<T>: NSObject { func addObject(object: T) { // do something... hopefully } }

Recibo el siguiente error del compilador:

Las subclases genéricas de las clases ''@objc'' no pueden tener un atributo explícito ''@objc'' porque no son directamente visibles desde Objective-C.

¿Significa esto que no hay manera de usar una clase Swift genérica en Objective-C?

¿Cómo se hace referencia directa a la clase?