在Swift上委派Objective-C协议

时间:2014-07-11 14:00:35

标签: ios objective-c delegates swift

我正在使用Swift语言在iOS上实现UDP侦听器。

为此,我正在转发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上实现该功能的方法:

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

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

class ViewController: UIViewController, GCDAsyncUdpSocketDelegate {
    ...
}

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

问题:我做错了什么?

2 个答案:

答案 0 :(得分:3)

override关键字用于覆盖超类的方法。由于您没有覆盖任何方法,因此不需要override关键字。

答案 1 :(得分:1)

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

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

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

如果将socket的变量声明为setupSocket函数内的局部变量,则一旦该函数完成,该对象的引用计数为0.将其作为该类的变量将解决该问题。

还应删除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
}