使用Swift协议继承
问题描述:
我想创建一个使用传统多态性来代替蓝牙LE,蓝牙等设备的代理,并且似乎无法获得铸造的语法权限。使用Swift协议继承
这里是我的父母协议和类:
@objc protocol DeviceDelegate
{
func didConnectToDevice(name:String)
func didFailToConnectToDevice(name:String)
func didDisconnectFromDevice(name:String)
func didWriteData(data:NSData)
func didReceiveData(data:NSData)
}
class Device: NSObject
{
var delegate: DeviceDelegate?
}
现在这里是子类和协议简化了下来:
protocol BluetoothDelegate : DeviceDelegate
{
func didFindService(name:String)
func didFindCharacteristic(name:String)
}
class BLE: Device
{
func someFunc()
{
let bluetoothDelegate = (delegate as? BluetoothDelegate)
bluetoothDelegate.didFindService(UUIDString)
}
}
它轻视该函数的第一线以下错误:
Cannot downcast from 'DeviceDelegate?' to [email protected] protocol type 'BluetoothDelegate'
这对我来说没有意义,因为它应该允许铸造成ac像通常的对象一样。
如果我在BluetoothDelegate我碰到下面的错误面前放@objc:
@objc protocol 'BluetoothDelegate' cannot refine [email protected] protocol 'DeviceDelegate'
任何人对此有什么想法?
答
当我复制你的代码,并将其直接粘贴到操场,并在您BluetoothDelegate
定义的前面加上@objc
,我得到一个消息,在这条线:
bluetoothDelegate.didFindService("asdf")
'BluetoothDelegate?' does not have a member named 'didFindService'
因为你已经使用as?
,有一个机会,bluetoothDelegate
是nil
。你应该在这里使用可选的链接。使用以下行报告替换操场中没有任何错误,表明您可能在代码中执行了其他您未显示的其他内容。
bluetoothDelegate?.didFindService("asdf")
或者,你可以这样做:
if let bluetoothDelegate = delegate as? BluetoothDelegate {
bluetoothDelegate.didFindService(UUIDString)
}
你看到有关DeviceDelegate
不是一个objc协议的消息表示,我认为你已经在两个不同的文件写的这些和可能会错误地宣布DeviceDelegate
。
我使用你的替代代码,仍然得到相同的结果,但: 他们在两个单独的文件,因为它们分别由父类和子类使用。我认为这可能是一个编译器错误,如果我将两个协议移动到一个文件,然后编译正确。 放在一边,并在新发布的XCode 6.3 Beta 2中测试,它在2个独立的文件中正常工作。 谢谢! – Khirok 2015-02-23 18:30:50