gpt4 book ai didi

ios - 为什么委托(delegate)方法需要在 Swift 中公开?

转载 作者:可可西里 更新时间:2023-11-01 05:43:26 25 4
gpt4 key购买 nike

我正在快速开发一个框架。我正在创建一个类来处理框架中的 BLE 内容。此类应该是公开的,因为我需要从使用我的框架的外部应用程序访问此类。我的类(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) {

//}
}

我有 explore apple 文档 here和一个 SO 问题 here .我开始知道,因为我的类和协议(protocol)都是公开的,所以方法应该是公开的。

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

我想将委托(delegate)方法保密,这样就没有人可以手动调用它们。

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

最佳答案

试图在公共(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
}

关于ios - 为什么委托(delegate)方法需要在 Swift 中公开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34154525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com