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

Kap*_*isa 5 protocols class ios swift2

我正在快速开发一个框架。我正在创建一个类来处理框架中的 BLE 内容。这个类应该是公共的,因为我需要从使用我的框架的外部应用程序访问这个类。我的班级结构如下:

public class MyClass: NSObject, CBCentralManagerDelegate {
}
Run Code Online (Sandbox Code Playgroud)

MyClass是 public,它确认了一个公共协议CBCentralManagerDelegate。编译器强迫我将它的委托方法声明为公共方法。所以这是我的实现:

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) {

    //}
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我有哪些可能的解决方案?

Cih*_*Tek 3

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

如果您确实需要隐藏它们,您可以添加一个私有实例变量,该变量将充当委托而不是类本身,如下所示:

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

    public override func viewDidLoad()
    {
        super.viewDidLoad()
        subdelegate = DelegateType(parent: self)
        someOtherObject.delegate = subdelegate
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在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
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答和评论,但公开的问题是,任何人都可以手动调用这些方法,委托方法不应该手动调用,那怎么样? (5认同)