在 Swift 上委托 Objective-C 协议

Posted

技术标签:

【中文标题】在 Swift 上委托 Objective-C 协议【英文标题】:Delegating Objective-C Protocol on Swift 【发布时间】:2014-07-11 14:00:35 【问题描述】:

我正在使用 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 
    ...

除了覆盖之外,我没有遇到任何编译错误。

问题:我做错了什么?

【问题讨论】:

【参考方案1】:

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

【讨论】:

只是想写那个:) 谢谢,即使我不使用 override 修饰符,函数也不会被调用,func 声明对吗?我没有收到关于套接字配置的任何错误。 我倾向于依靠 Xcode 的自动完成功能来获得正确的 ObjC-in-Swift 方法签名。 自动完成没有从 GCDAsyncUdpSocketDelegate 带来任何东西。 原来我没有调用开始接收数据的函数,我添加了udpSocket.beginReceiving(&error),它成功了,谢谢。【参考方案2】:

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

1) 我没有在代码 sn-p 中看到您在 udpSocket 变量上设置委托的位置

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

如果您在 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

【讨论】:

委托在 GCDAsyncUdpSocket 创建时设置。我尝试将 udpSocket 作为类 var,但它也不会以这种方式工作。 我已经设置了委托和方法,但它的委托没有在目标 c 中调用

以上是关于在 Swift 上委托 Objective-C 协议的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中正确实现不同视图控制器之间的协议和委托?

如何在 Swift 中转换 Objective-C TOCropViewController 委托方法?

swift 2:与objective-c相比,推送通知没有委托回调

Objective-C中的委托(代理)模式

swift - 我的协议和代表不工作

Swift:UIPopoverPresentationControllerDelegate 委托变为 nil