在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 }