使用Swift协议继承

使用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?,有一个机会,bluetoothDelegatenil。你应该在这里使用可选的链接。使用以下行报告替换操场中没有任何错误,表明您可能在代码中执行了其他您未显示的其他内容。

bluetoothDelegate?.didFindService("asdf") 

或者,你可以这样做:

if let bluetoothDelegate = delegate as? BluetoothDelegate { 
    bluetoothDelegate.didFindService(UUIDString) 
} 

你看到有关DeviceDelegate不是一个objc协议的消息表示,我认为你已经在两个不同的文件写的这些和可能会错误地宣布DeviceDelegate

+0

我使用你的替代代码,仍然得到相同的结果,但: 他们在两个单独的文件,因为它们分别由父类和子类使用。我认为这可能是一个编译器错误,如果我将两个协议移动到一个文件,然后编译正确。 放在一边,并在新发布的XCode 6.3 Beta 2中测试,它在2个独立的文件中正常工作。 谢谢! – Khirok 2015-02-23 18:30:50