1

我正在尝试创建一个使用传统多态性来补偿蓝牙 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'

有人对此有任何想法吗?

4

1 回答 1

1

当我复制您的代码并将其直接粘贴到操场并添加@objc到您的定义前面时BluetoothDelegate,我在此行收到一条消息:

bluetoothDelegate.didFindService("asdf")

“蓝牙代理?” 没有名为“didFindService”的成员

因为你用过as?,有机会bluetoothDelegate就是nil。您应该在这里使用可选链接。替换为以下行报告在操场上没有错误,这表明您可能在代码中做了一些您没有向我们展示的其他事情。

bluetoothDelegate?.didFindService("asdf")

或者,你可以使用这个:

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

您看到的关于DeviceDelegate不是 objc 协议的消息向我表明,您已将它们写在两个不同的文件中,并且可能前向声明DeviceDelegate不正确。

于 2015-02-23T18:19:41.623 回答