Как передать структуру Swift в качестве параметра методу Objective-C

у меня есть метод Objective-C, который принимает параметр типа id и я хочу передать ему быструю структуру.

:

@implementation ObjcClass
+ (void)addListener:(id)listener {
    // Do something with listener
}

:

struct DemoStruct {
    func registerAsListener() {
        ObjcClass.addListener(self) // Can't find a way to do this
    }
}

сообщение об ошибке компиляции, которое я получаю:

тип "DemoStruct" не соответствует протоколу "AnyObject"

поэтому мой вопрос будет, как сделать метод Objective-C accept Any вместо AnyObject а есть такая вещь?

2 ответов


вы не можете сделать это.

структуры Swift недоступны из Objective-C. Об этом говорится в книге "использование Swift с Cocoa и Objective-C" от Apple:

У вас будет доступ ко всему, что находится в классе или протоколе, помеченном атрибутом @objc, если он совместим с Objective-C. Это исключает только Swift-функции, такие как перечисленные здесь:

  • дженериков
  • ОК
  • перечисления, определенные в Swift
  • структуры, определенные в Swift
  • функции верхнего уровня, определенные в Swift
  • глобальные переменные, определенные в Swift
  • Typealiases определенные в Swift
  • Свифт-стиль в
  • вложенные типы
  • Каррированные функции

Выдержка Из: Apple Inc. "Использование Swift с какао и Objective-C." iBooks. https://itun.es/gb/1u3-0.l


лучшее, что я нашел, это обернуть в класс Box

public class Box<T> {
    let unbox: T
    init(_ value: T) {
        self.unbox = value
    } }