访问 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 类的私有成员?

如何在 Obj-C 或 Swift 中访问私有实例变量?

在组合项目中从Swift类访问Objective-C类中的singleton sharedInstance

Swift中类和结构体

Swift中类的两段式构造(类的构造过程)

从子类访问父类的私有实例变量?