我正在尝试创建一个使用传统多态性来补偿蓝牙 LE、蓝牙等设备的委托,并且似乎无法获得正确的语法来进行转换。
这是我的父协议和类:
@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 non-@objc protocol type 'BluetoothDelegate'
这对我来说没有意义,因为它应该允许像通常的对象一样投射到孩子身上。
如果我将 @objc 放在 BluetoothDelegate 前面,我会收到以下错误:
@objc protocol 'BluetoothDelegate' cannot refine non-@objc protocol 'DeviceDelegate'
有人对此有任何想法吗?