为什么委托方法需要在Swift中公开?

我正在迅速开发一个框架。 我正在创build一个在框架中处理BLE东西的类。 这个类应该是公开的,因为我需要从使用我的框架的外部应用程序访问这个类。 我的课堂结构如下:

public class MyClass: NSObject, CBCentralManagerDelegate { } 

这里MyClass是公共的,它确认了一个公共协议CBCentralManagerDelegate 。 编译器迫使我把它的委托方法声明为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) { //} } 

我在这里探索苹果文件, 这里是一个SO的问题。 我开始知道,因为我的class级和协议都是公开的,所以这些方法应该是公开的。

这个问题是,外部应用程序可以很容易地创build我的类的实例,并调用这个方法,这是我的框架不期望。

我想保持委托方法私人,所以没有人可以手动调用它们。

我有什么可能的解决scheme?

试图在公共类中隐藏公共协议的方法没有多大意义,因为它首先违背了使用协议的目的。

如果你真的需要隐藏它们,你可以添加一个私有的实例variables来代替这个类的代理:

 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实现委托方法。

 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 }