objective c - cómo pasar un Swift Struct como parámetro a un método Objective-C
(2)
Tengo un objetivo c que acepta un parámetro "id" y quiero pasarlo a Swift Struct.
// archivo: ObjcClass.m
@implementation ObjcClass
+ (void)addListener:(id)listener {
//... do something with listener
}
//file DemoStruct.swift
Struct DemoStruct {
func registerAsListener() {
ObjcClass.addListener(self) //Cant find a way to do this
}
}
El mensaje de error de compilación que recibo:
Tipo ''DemoStruct'' no se ajusta al protocolo ''AnyObject''
Entonces mi pregunta sería, ¿cómo puedo hacer que un método Object -C acepte '' Any '' en lugar de '' AnyObject '' y existe tal cosa?
No puedes hacerlo
Swift structs no son accesibles desde Objective-C. Esto se afirma en el libro "Using Swift With Cocoa and Objective-C" de Apple:
Tendrás acceso a cualquier cosa dentro de una clase o protocolo que esté marcado con el atributo @objc, siempre que sea compatible con Objective-C. Esto excluye las características exclusivas de Swift como las que se enumeran a continuación:
- Genéricos
- Tuples
- Enumeraciones definidas en Swift
- Estructuras definidas en Swift
- Funciones de nivel superior definidas en Swift
- Variables globales definidas en Swift
- Tipealias definidas en Swift
- Variadics de estilo Swift
- Tipos anidados
- Funciones al curry
Extracto de: Apple Inc. "Uso de Swift con Cocoa y Objective-C." IBooks. https://itun.es/gb/1u3-0.l
Lo mejor que encontré fue envolver en una clase Box
public class Box<T> {
let unbox: T
init(_ value: T) {
self.unbox = value
} }