本文介绍了为什么委托方法在SWIFT中需要是公共的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用SWIFT开发一个框架。我正在创建一个在框架中处理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) {

    //}
}
我浏览了Apple文档here和SO问题here。我开始意识到,因为我的类和协议都是公共的,所以方法也应该是公共的。

这样做的问题是,外部应用程序可以轻松地创建我的类的实例并调用此方法,这是我的框架不希望看到的。

我希望将委托方法保持为私有,这样就没有人可以手动调用它们。

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

推荐答案

尝试在公共类中隐藏公共协议的方法没有多大意义,因为这违背了最初使用协议的目的。

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

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
}

这篇关于为什么委托方法在SWIFT中需要是公共的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 06:50