我正在迅速开发一个框架。我正在创建一个处理框架中BLE内容的类。此类应为公共(public)类,因为我需要从使用我的框架的外部应用程序访问此类。我的类(class)结构如下:

public class MyClass: NSObject, CBCentralManagerDelegate {
}

此处MyClass是公共(public)的,它确认了公共(public)协议(protocol)CBCentralManagerDelegate。编译器迫使我将其委托(delegate)方法声明为public。因此,我的实现如下所示:
public class MyClass: NSObject, CBCentralManagerDelegate {
    public func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {

    }
    // I don't want delegate methods to be public, delegate  methods should be like:
    //func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {

    //}
}

我已经探究了苹果文档here和一个SO问题here。我知道,由于我的类和协议(protocol)都是公共(public)的,因此方法也应该是公共(public)的。

问题是,外部应用程序可以轻松地创建我的类的实例并调用此方法,而我的框架对此并不期望。

我想将委托(delegate)方法保持私有(private)状态,因此没有人可以手动调用它们。

我有什么可能的解决方案?

最佳答案

试图在公共(public)类中隐藏公共(public)协议(protocol)的方法没有多大意义,因为它首先破坏了使用协议(protocol)的目的。

如果确实需要隐藏它们,则可以添加一个私有(private)实例变量,该变量将充当委托(delegate),而不是像这样的类本身:

public class MyClass: SomeClass
 {
    private let someVariable
    private var subdelegate :DelegateType?

    public override func viewDidLoad()
    {
        super.viewDidLoad()
        subdelegate = DelegateType(parent: self)
        someOtherObject.delegate = subdelegate
    }
}

然后在DelegateType中实现委托(delegate)方法。
private class DelegateType : NSObject, HiddenProtocol
{
    private weak var parent: MyClass?

    init(parent: MyClass)
     {
        super.init()
        self.parent = parent
    }

    // Implement delegate methods here by accessing the members
    // of the parent through the 'parent' variable
}

10-07 19:05
查看更多