【问题标题】:Swift - Issue trying to access to Singleton objectSwift - 尝试访问 Singleton 对象的问题
【发布时间】:2015-06-09 13:20:30
【问题描述】:

我正在尝试在我的应用程序上实现单例模式,但到目前为止没有成功。当我尝试访问我的单例时,似乎程序不是在访问真正的单例,而是它的副本。由于此副本未初始化,我的应用程序崩溃,显示此错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

这是我编写的代码示例:

import UIKit

class ViewController: UIViewController {

    static let sharedViewController = ViewController()

    var name: String = "Billy"
    var age: Int = 12

    override func viewDidLoad() {
        super.viewDidLoad()

        println("Old name from ViewController: \(name)")
        println("Old age from ViewController: \(age)")

        name = "Jack"
        age = 45

        println("New name from ViewController: \(name)")
        println("New age from ViewController: \(age)")

        println("singleton name from ViewController: \(ViewController.sharedViewController.name)")
        println("singleton name from ViewController: \(ViewController.sharedViewController.age)")
    }
}

如您所见,这非常简单。该类有两个在创建时初始化的属性,在viewDidLoad() 中进行了修改。首先,我尝试直接访问属性,然后通过 Singleton。

这是输出:

Old name from ViewController: Billy
Old age from ViewController: 12
New name from ViewController: Jack
New age from ViewController: 45
singleton name from ViewController: Billy
singleton name from ViewController: 12

如您所见,从单例的角度来看,数据仍然相同。不幸的是,年轻的比利永远不会长大。

我在 Swift 中实现了单例模式的所有三种方法,正如在这个主题上所说的那样:dispatch_once singleton model in swift,但没有任何成功。

我不明白为什么我不能访问真正的 Singleton 并且只能访问它的副本(这对 Singleton 模式不利)。

感谢您的帮助。

【问题讨论】:

    标签: swift design-patterns ios8 singleton


    【解决方案1】:

    我认为,最终,您不会将 UIViewController 设为单例。您可能想要创建一个类,例如 Person

    如果你不想像以前那样做 static let sharedViewController = ViewController()self 不是同一个对象

    import UIKit
    
    class ViewController: UIViewController {
    
        static let sharedViewController = ViewController()
    
        var name: String = "Billy"
        var age: Int = 12
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            println("VC - Name : \(name)")
            println("VC - Age : \(age)")
    
            println("Singleton - Name : \(name)")
            println("Singleton - Age : \(age)")
    
            ViewController.sharedViewController.name = "Jack"
            ViewController.sharedViewController.age = 45
    
            println("VC - Name : \(name)")
            println("VC - Age : \(age)")
    
            println("Singleton - Name : \(ViewController.sharedViewController.name)")
            println("Singleton - Age : \(ViewController.sharedViewController.age)")
    
        }
    }
    

    控制台:

    VC - Name : Billy
    VC - Age : 12
    Singleton - Name : Billy
    Singleton - Age : 12
    VC - Name : Billy
    VC - Age : 12
    Singleton - Name : Jack
    Singleton - Age : 45
    

    无论如何,尝试更多地记录下单例模式:-)

    【讨论】:

    • 好的,我现在知道了!如果我想使用单例模式,即使在类内我也必须修改单例,而不是self,如果特定数据将在类外使用。谢谢你的帮助;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多