Вызов метода класса Obj-C с именем init из Swift - PullRequest
0 голосов
/ 23 сентября 2018

Я использую стороннюю библиотеку в своем коде Swift 4.1, которая имеет заголовочный файл Obj-C с методом уровня класса с именем init().Когда я пытаюсь вызвать его, компилятор запутывается и говорит, что это неоднозначно, хочу ли я использовать инициализатор экземпляра или этот статический метод инициализации, например так:

My3rdPartyClass.init() // Error: Ambiguous use of 'init()'

В My3rdPartyClass.h файл:

@interface My3rdPartyClass : NSObject

+(void)init;

@end

1 Ответ

0 голосов
/ 23 сентября 2018

Неопределенность возникает (в Swift <= 4,1 </strong>), потому что оба метода класса

+ (void)init;

и NSObject s init метод

- (instancetype)init

являютсявызывается из Swift как My3rdPartyClass.init().Возможные решения:

  • Переименуйте метод класса Objective-C.
  • Аннотируйте объявление функции с другим именем Swift:

    +(void)init NS_SWIFT_NAME(classInit());
    

    Это оставляет интерфейс Objective C неизменным, но функцию можно вызвать из Swift как

    OClass.classInit()
    
  • Если модификация заголовочного файла Objective-C невозможна, вы все равно можете вызвать функцию из Swift как

    My3rdPartyClass.init() as Void
    

    Тип возвращаемого значения Void разрешаетНеоднозначность.

Начиная с Swift 4.2 (Xcode 10) вы можете вызывать метод класса как

OClass.`init`()

без каких-либо изменений в Objective-C API (ссылка на @Hamish).Обратные метки сообщают компилятору, что вы имеете в виду функцию-член, а не инициализатор.

...