符合Objective-C协议的Swift类

时间:2014-12-07 19:13:28

标签: ios objective-c swift chromecast

在Objective-C中,我有the following protocol

@protocol GCKDeviceScannerListener <NSObject>    
@optional

- (void)deviceDidComeOnline:(GCKDevice *)device;
- (void)deviceDidGoOffline:(GCKDevice *)device;
- (void)deviceDidChange:(GCKDevice *)device;

@end

当试图在Swift Xcode 6.1中符合这个协议时,自动完成它就像这样:

class ViewController: UIViewController, GCKDeviceScannerListener {

    override func viewDidLoad() {
        super.viewDidLoad()
        var deviceScanner = GCKDeviceScanner();
        deviceScanner.addListener(self);
        deviceScanner.startScan();
        println("scanning");
    }

    func deviceDidComeOnline(device: GCKDevice!) {
        println("deviceDidComeOnline()");
    }

    func deviceDidGoOffline(device: GCKDevice!) {
        println("deviceDidGoOffline()");
    }

    func deviceDidChange(device: GCKDevice!) {
        println("deviceDidChange()");
    }

}

代码编译并且似乎在模拟器上运行正常。但是,没有触发任何侦听器功能。只运行用Objective-C编写的the demo project from Google时,所有内容都可以正常运行。因为最后一部分我假设网络或硬件没有任何问题或类似的东西。

可能是我错过了https://developers.google.com/cast/docs/ios_sender中的重要内容,但我想知道根据协议Swift代码本身是否正确。由于协议只有可选功能,因此很难知道它是否正确。

2 个答案:

答案 0 :(得分:2)

我没有使用此库的经验,但我认为您应该保留对GCKDeviceScanner的引用。

尝试:

class ViewController: UIViewController, GCKDeviceScannerListener {

    var deviceScanner = GCKDeviceScanner()

    override func viewDidLoad() {
        super.viewDidLoad()
        deviceScanner.addListener(self)
        deviceScanner.startScan()
        println("scanning")
    }

答案 1 :(得分:0)

Apple's documentation on Protocols漫长而复杂。

最容易想到optional协议方法,例如Optional closures,您可以将它与可选链接一起使用。

@objc class Something {
    var delegate: GCKDeviceScannerListener?

    func someCallback() {
        delegate?.deviceDidComeOnline?(device)
    }
}