【问题标题】:Swift, multiple inheritance from classesSwift,类的多重继承
【发布时间】:2014-12-27 04:40:40
【问题描述】:

这是我创建的自定义类:

import UIKit
import CoreBluetooth

protocol vaBeanDelegate
{

}

class vaBean: CBCentralManager, CBCentralManagerDelegate {

override init!(delegate: CBCentralManagerDelegate!, queue: dispatch_queue_t!) {
    println("bean initialised")
    super.init()
    self.delegate = delegate
}

func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
    println("discovered peripheral(s)")
}

func centralManagerDidUpdateState(central: CBCentralManager!) {
    switch (central.state) {
    case .PoweredOff:
        println("hardware is powered off")

    case .PoweredOn:
        println("hardware is powered on and ready")
        //centralManager.scanForPeripheralsWithServices(nil, options: nil)
    case .Resetting:
        println("hardware is resetting")

    case .Unauthorized:
        println("state is unauthorized")

    case .Unknown:
        println("state is unknown");

    case .Unsupported:
        println("hardware is unsupported on this platform");

    }
}

func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {
    println("didConnectPeripheral")
}
}

我只是不知道如何从我的主 ViewController 初始化它。当我尝试以下操作时,它抱怨 ViewController 不符合 CBCentralManagerDelegate:

import UIKit

class ViewController: UIViewController {

var myBean: vaBean!

override func viewDidLoad() {
    super.viewDidLoad()
    println("blueToothTest v1.00")
    println("opening bluetooth connection ...")
    myBean = vaBean(delegate: self, queue: nil)
}

override func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()}
}

【问题讨论】:

  • 这是因为在 Swift 中不能有多重继承。您可以拥有任意数量的协议,但只能拥有一个超类。
  • 当你写vaBean(delegate: self, queue: nil)时,self指的是ViewController,它不能作为一个委托,因为它不符合委托协议。我认为您最好的选择是将自定义初始化程序更改为仅采用 queue 参数,并将其设置为 self.delegate = self - 在初始化程序的上下文中,self 将引用您的 vaBean 实例,这就是您的想要。
  • 谢谢托德,感激不尽。

标签: ios inheritance swift compiler-errors


【解决方案1】:

您的 ViewController 不符合协议 CBCentralManagerDelegate

看看这个:

myBean = vaBean(delegate: self, queue: nil)

构造函数init的第一个参数需要一个符合CBCentralManagerDelegate协议的参数delegate的对象。您将 self 传递到那里,这是您的视图控制器,它没有实现该委托(即使它还没有定义任何函数。那会抛出错误。

你有两个选择来解决这个问题:

1) 通过这样声明,直接在视图控制器中实现 CBCentralManagerDelegate

class ViewController: UIViewController, CBCentralManagerDelegate { 
    // Here goes the rest of your class
    // Don't forget to add delegate functions once you added some
}

2) 在文件末尾为类添加扩展,以增加协议的一致性

extension UIViewController: CBCentralManagerDelegate { 
    // Empty for now since the protocol does not require anything at the moment
    // Don't forget to add delegate functions once you added some
}

【讨论】:

    【解决方案2】:

    如果它抱怨 ViewController 不符合 CBCentralManagerDelegate,你可以尝试使用下面的代码。

    extension viewController: CBCentralManagerDelegate {
        //implement the methods in CBCentralManagerDelegate here
    }
    

    在 swift 中,仅像上面所说的那样是单继承,但这种支持实现了多种协议,例如 Java 中的接口。

    在您的示例代码中,vaBean 实现协议 CBCentralManagerDelegate。

    【讨论】:

      【解决方案3】:

      Swift 和 Objective-C 只是单继承,一个类不能有多个超类。

      当您看到声明中包含多个超类的 Swift 代码时,您最多会看到声明中的一个名称是超类,其他名称是协议的名称。

      在 Objective-C 中,这些应该是用 <angled brackets> 编写的,但对于 Swift,情况并非如此。

      【讨论】:

      • 其他是协议的名称
      • @BryanChen 或 Java 中的 接口
      【解决方案4】:

      Swift 不支持多重继承。但是,正如您的问题所暗示的那样,如果您只想访问它,则您的 ViewController 不需要从 vaBeanDelegate 继承。

      【讨论】:

      • 您需要显示更多代码(尤其是您正在调用的 vaBean 的初始化程序的签名)。 vaBean delegate 需要什么?
      • 我正在尝试做一些非常简单的事情,但很挣扎。我想要一个单独的文件(类),它只是 CBCentralManager 的继承 - 这样它就可以处理蓝牙。我的代码在主 ViewController 中工作,但想将其移出以便遵循 MVC 伦理。
      猜你喜欢
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多