访问 Swift 类的正在运行的实例
Posted
技术标签:
【中文标题】访问 Swift 类的正在运行的实例【英文标题】:Accessing a Running Instance of a Class Swift 【发布时间】:2021-07-29 18:40:26 【问题描述】:我在文件 A 中有类 A,在文件 B 中有类 B。在类 B 中,我想访问类 A 的运行实例,以便运行位于其中的函数。这两个类都连接到视图控制器。我不想像classAInstance = classA()
那样创建类 A 的新实例,而是访问我的应用程序已经在运行的类 A 的实例。任何帮助将不胜感激。
这是我在 A 类中的部分代码:
Class A
func reloadTableView()
self.CardsTableView.reloadData()
这是我在 B 类中的部分代码:
Class B
@IBAction func saveButton(_ sender: UIButton)
// here is where I want to call reloadTableView() from class A
【问题讨论】:
我们无法用所提供的信息真正回答您的问题。请参阅:How do I ask a good question? 和 How to create a Minimal, Reproducible Example。 在 Swift 中,“A 类的运行实例”没有任何意义。没有类的“运行”实例。你的意思是“每个实例化的实例”?没有办法遍历记忆并找到那些。创建一个实例不会注册任何东西。您需要创建一个手动机制来注册要跟踪的所有实例。或者,您可能正在寻找一个共享实例(有时称为“单例”,尽管这在 Swift 中通常不正确)。有关示例,请参见 hackingwithswift.com/example-code/language/what-is-a-singleton。 【参考方案1】:我可能使用的快速而肮脏的方法是你有一些单例,你可以在其中存储你的类的当前实例。
例子:
class EnvironmentUtility
private static var instance: EnvironmentUtility?
internal class func shared() -> EnvironmentUtility
guard let currentInstance = instance else
instance = EnvironmentUtility()
return instance!
return currentInstance
var myClassA: ClassA? = nil
var myClassB: ClassB? = nil
然后在那些 ViewControllers/Classes 的 viewDidLoad(或者你喜欢的其他地方)中:
class ClassA: UIViewController
…
override func viewDidLoad()
…
EnvironmentUtility.shared().myClassA = self
…
稍后在 ClassB 中,您可以:
class ClassB: UIViewController
…
@IBAction func saveButton(_ sender: UIButton)
EnvironmentUtility.shared().myClassA.reloadTable()
…
这不是最漂亮或最快捷的方式,但又快又脏。
如果您想编写更好的解决方案,我建议您查看 MVVM-C Swift 架构模式(我自己使用这种模式)。在此架构中,您将可以访问海外 viewController 转换的 Coordinator,并且您还可以以更优雅的方式跟踪 ViewControllers/Classes 的当前实例。
这是 MVVM-C 的速成课程:https://marcosantadev.com/mvvmc-with-swift/
【讨论】:
完美运行,谢谢!以上是关于访问 Swift 类的正在运行的实例的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Swift 扩展访问 Objective-C 类的私有成员?