在Swift上委托Objective-C协议

我使用Swift语言在iOS上实现UDP Listener。

为此,我在CocoaAsyncSocket项目上继续。

我成功地使用Bridging-Header.h导入CocoaAsyncSocket库,我可以从Objective-C类调用函数,但是我无法在swift上编写委托函数。

这是我设置Socket并将ViewController.swif定义为侦听器的委托类的代码:

func setupSocket() { var udpSocket : GCDAsyncUdpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) var error : NSError? let port : UInt16 = 12121 let address : String = "228.5.12.12" udpSocket.bindToPort(port, error: &error) udpSocket.joinMulticastGroup(address, error: &error) udpSocket.enableBroadcast(true, error: &error) println("228.5.12.12") } 

这是Objective-C中的前一个委托函数:

 - (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext; 

最后,这就是我在Swift上实现的function:

 override func udpSocket(sock : GCDAsyncUdpSocket!, didReceiveData data : NSData!, fromAddress address : NSData!, withFilterContext filterContext : AnyObject!) { println(data) } 

ViewController类被声明为实现正确的协议:

 class ViewController: UIViewController, GCDAsyncUdpSocketDelegate { ... } 

我没有编译错误,除了覆盖。

问题:我做错了什么?

override关键字是用于重写超类的方法。 由于您不覆盖任何方法,所以不需要override关键字。

您的委托方法有两种可能性不被调用。

1)我没有在代码片段中看到你在udpSocketvariables上设置委托

2)ARC可能也会发挥作用,你创build的GCDAsyncUdpSocket对象实例已经释放了内存。

如果将套接字的variables声明为setupSocket函数内的局部variables,那么一旦函数完成对象的引用计数为0,将其作为类的variables将解决该问题。

另外,应该删除override关键字,因为只有在覆盖基类中的方法时才使用该关键字。

 var udpSocket: GCDAsyncUdpSocket! func setupSocket() { udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) if (udpSocket == nil) { // Should display an error here return } // Set delegate udpSocket.delegate = self // Other code that you had }