符合目的-C协议夫特类
在Objective-C我有the following protocol:符合目的-C协议夫特类
@protocol GCKDeviceScannerListener <NSObject>
@optional
- (void)deviceDidComeOnline:(GCKDevice *)device;
- (void)deviceDidGoOffline:(GCKDevice *)device;
- (void)deviceDidChange:(GCKDevice *)device;
@end
当试图以符合该协议在夫特的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,但我想知道如果斯威夫特代码本身是正确的,根据协议。由于该协议只有可选功能,因此很难确定它是否正确。
我有这个库中没有经验,但我认为你应该保持参照GCKDeviceScanner
。
尝试:
class ViewController: UIViewController, GCKDeviceScannerListener {
var deviceScanner = GCKDeviceScanner()
override func viewDidLoad() {
super.viewDidLoad()
deviceScanner.addListener(self)
deviceScanner.startScan()
println("scanning")
}
因为我认为这与我的问题没有任何关系,但是之后我查看了你的SO分数,然后试用了它,结果很奏效。 :)你知道还是关心评论它为什么像这样工作? – 2014-12-08 18:31:02
在您的原始代码中,当'viewDidLoad'返回时'deviceScanner'被释放。我认为,这会默默取消扫描,并删除其听众。 – rintaro 2014-12-09 04:53:21
Apple's documentation on Protocols是漫长而复杂的。
最简单的想法是optional
协议方法(如可选闭包),您可以将其与可选链接一起使用。
@objc class Something {
var delegate: GCKDeviceScannerListener?
func someCallback() {
delegate?.deviceDidComeOnline?(device)
}
}
我不认为这是我正想什么OP要求 – 2014-12-07 19:50:53
您可以通过使用'self.respondsToSelector测试你的ViewController的协议一致性(“deviceDidComeOnline:”)' – Darren 2014-12-07 19:30:36