ObjC <-> Swift bridging и фабричные методы - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть класс Objective-C, который я хочу использовать в Swift.По причинам, которые выходят за рамки этого вопроса, мой метод класса init помечен как недоступный.Вместо этого есть фабричный метод.Это упрощение того, как выглядит мой класс:

@interface MyClass : NSObject
+ (instancetype)myClass;
- (instancetype)init NS_UNAVAILABLE;
@end

Когда я использую его из Swift, я могу сделать let x = MyClass(), и это хорошо, потому что, согласно правилам мостового соединения, компилятор пытается отобразитьфабричные методы к обычным инициализаторам.Проблема в том, что вместо фабричного метода вызывается «недоступный» метод init.

Как заставить Swift использовать фабричный метод?


Дополнительные эксперименты:

Я уверен, что NS_UNAVAILABLE работает, потому что, если я сделаю:

@interface MyClass : NSObject
- (instancetype)init NS_UNAVAILABLE;
@end

Затем на стороне Swift я получаю ожидаемое 'init()' is unavailable сообщение об ошибке.

Это означает, что это фабричный метод, который позволяет let x = MyClass() компилировать, но во время выполнения вызывается «неправильный» метод.

1 Ответ

0 голосов
/ 10 декабря 2018

Кажется, что замена двух методов в заголовочном файле, а именно

@interface MyClass : NSObject
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)myClass;
@end

, делает свое дело.Спасибо Хэмишу Найту, который нашел его (https://bugs.swift.org/browse/SR-9456).

). Я буду использовать этот подход, пока он не будет исправлен на стороне компилятора.

...