我们正在将现有的类从Objective-C迁移到Swift。在视图控制器类中,我正在实现一个协议,并尝试将视图控制器添加为其中包含的对象的委托。当我尝试在Swift中添加'self'作为对象的委托时,我得到以下编译错误:
def get(self, request, *args, **kwargs):
if request.user.is_authenticated():
return HttpResponseRedirect('/')
return super(MyCBV_vw, self).get(request, *args, **kwargs)
以下是Obj-C
中的现有实现Cannot call value of non-function type '((ListenerProtocol) -> Void)?
将类添加为侦听器(委托)
@interface SomeViewController : UIViewController <ListenerProtocol> ...
这没有任何问题。但Swift版本在看起来像是相同的代码时失败了。这是同一个电话的Swift版本:
[manager addListener:self];
调用'addListener'
@objc class SomeSwiftViewController: UIViewController, ListenerProtocol ...
我已成功验证'self'是运行时的ListenerProtocol对象,方法是检查:
manager?.addListener(self)
在包含delegate属性的对象中,addListener方法在Objective-C中定义如下:
if self.conformsToProtocol(ListenerProtocol){
// ...
}
Swift类完全实现了ListenerProtocol中定义的所有方法。我无法理解为什么这在Swift中不起作用。谁能提出建议?谢谢!
答案 0 :(得分:2)
问题不在于ListenerProtocol
,而在于manager
实现的协议。根据类型判断,addListener
似乎是作为可选方法提供的。注意函数类型末尾的问号:
((ListenerProtocol) -> Void)?
这通常发生在(实际上,我认为只发生)Objective-C可选协议方法。
您应该可以撰写manager?.addListener?(self)
或manager?.addListener!(self)
。