swift2 为什么委托方法在Swift中需要是公共的?

pftdvrlh  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(181)

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

public class MyClass: NSObject, CBCentralManagerDelegate {
}

这里的MyClass是public的,它确认了一个public协议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) {

    //}
}

我已经研究了苹果的文档here和一个问题here。我开始知道,因为我的类和协议都是公共的,所以方法应该是公共的。
这样做的问题是,外部应用程序可以很容易地创建我的类的示例并调用此方法,这是我的框架所不期望的。
我希望将委托方法保持为私有,这样就没有人可以手动调用它们。
我有什么可能的解决方案?

fsi0uk1n

fsi0uk1n1#

试图将公共协议的方法隐藏在公共类中没有多大意义,因为这首先就违背了使用协议的目的。
如果你真的需要隐藏它们,你可以添加一个私有的示例变量来代替类本身作为一个委托,如下所示:

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
}

相关问题