Objective-C协议在Swift中无法识别

时间:2016-07-08 20:18:16

标签: objective-c swift

我们正在将现有的类从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中不起作用。谁能提出建议?谢谢!

1 个答案:

答案 0 :(得分:2)

问题不在于ListenerProtocol,而在于manager实现的协议。根据类型判断,addListener似乎是作为可选方法提供的。注意函数类型末尾的问号:

((ListenerProtocol) -> Void)?

这通常发生在(实际上,我认为只发生)Objective-C可选协议方法。

您应该可以撰写manager?.addListener?(self)manager?.addListener!(self)