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?
Los tipos genéricos de Swift no se pueden usar en Objective-C.
Esto excluye las funciones solo de Swift, como las que se enumeran aquí:
- Genéricos
- ...