我正在使用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 {
...
}
除了覆盖之外,我没有编译错误。
问题:我做错了什么?
答案 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
}