2016-07-08 2 views
0

Мы находимся в процессе переноса существующих классов из Objective-C в Swift. В классе контроллера вида я реализую протокол и пытаюсь добавить контроллер представления в качестве делегата объекта, содержащегося в нем. Когда я пытаюсь добавить «себя» в качестве делегата объекта в Swift я получаю следующее компиляции ошибка:Протокол Objective-C не распознается в Swift

Cannot call value of non-function type '((ListenerProtocol) -> Void)? 

Вот существующая реализация в Obj-C

@interface SomeViewController : UIViewController <ListenerProtocol> ... 

А добавив класс как слушатель (делегат)

[manager addListener:self]; 

Это работает без проблем. Но версия Swift терпит неудачу в том, что похоже на тот же код. Вот версия Swift одного и того же вызова:

@objc class SomeSwiftViewController: UIViewController, ListenerProtocol ... 

И призыв к «AddListener»

manager?.addListener(self) 

Я успешно, что «я» является объектом ListenerProtocol во время выполнения проверяется путем проверки:

if self.conformsToProtocol(ListenerProtocol){ 
    // ... 
} 

в объекте, содержащем свойство делегата способ добавления слушателя определен в Objective-C следующим образом:

- (void)addListener:(id<ListenerProtocol>)listener { 
    // ... 
} 

Класс Swift полностью реализует все методы, определенные в ListenerProtocol. Я не понимаю, почему это не работает в Swift. Может ли кто-нибудь сделать предложение? Благодаря!

+0

Не могли бы вы показать, где определено 'manager.addListener'? –

ответ

2

Проблема не с ListenerProtocol, это протокол, который использует manager. Судя по типу, addListener представляется как дополнительный метод. Обратите внимание на знак вопроса в конце типа функции:

((ListenerProtocol) -> Void)? 

Это обычно происходит с (на самом деле, я думаю, что это только происходит с) методой факультативного протокола Objective-C.

Вы должны уметь писать manager?.addListener?(self) или manager?.addListener!(self).

+0

Я думаю, вы имели в виду, что '' addListener' представляется как дополнительный метод "(не addManager). Другая возможность заключается в том, что 'addListener' является необязательным свойством для менеджера. –

Смежные вопросы