在 Swift 2.1 中使用单例

Posted

技术标签:

【中文标题】在 Swift 2.1 中使用单例【英文标题】:Using Singleton in Swift 2.1 【发布时间】:2016-03-19 10:39:52 【问题描述】:

我编写了这个示例类来测试 Swift 2.1 中的 Singleton:

class FGSingleton 
    static let sharedInstance = FGSingleton()

    var gameScore: Int = 0

    let path = NSBundle.mainBundle().pathForResource("Data", ofType: "plist")
    //below line is creating issue because of using sharedInstance
    let dict = NSDictionary(contentsOfFile: sharedInstance.path!)

    // METHODS
    private init() 
        print(__FUNCTION__)
    
    func displayGameScore() 
        print("\(__FUNCTION__) \(self.gameScore)")
    
    func incrementGameScore(scoreInc: Int) 
        self.gameScore += scoreInc
    

但是当我像 FGSingleton.sharedInstance.displayGameScore() 这样调用函数时,它从不调用该函数,也不会从 init 打印。我尝试调试它,发现光标永远不会进入函数。

这是由于我在上面评论的那个错误行。知道如何从 sharedInstance 调用全局变量来为另一个全局变量赋值吗?

【问题讨论】:

首先,您的代码不是 Swift 2.1 (println)。此外,当我尝试使用您的代码调用 FGSingleton.sharedInstance.displayGameScore() 时,一切正常。 对不起,我的打字错误......但是这个示例代码在 ViewController 的 ViewDidLoad() 函数中不起作用。 我也试过了。它从 ViewController 的 viewDidLoad() 为我工作 【参考方案1】:

我发现最简单的解决方案是将全局变量初始化为可选变量,然后从init() 中的另一个全局变量为其分配一个值。这是我更新的代码:

class FGSingleton 
    static let sharedInstance = FGSingleton()

    var gameScore: Int = 0

    let path = NSBundle.mainBundle().pathForResource("Data", ofType: "plist")
    //initialize as optional
    let dict: NSDictionary?

    // METHODS
    private init() 
        print(__FUNCTION__)
        dict = NSDictionary(contentsOfFile: self.path!)
    
    func displayGameScore() 
        print("\(__FUNCTION__) \(self.gameScore)")
    
    func incrementGameScore(scoreInc: Int) 
        self.gameScore += scoreInc
    

如果有其他更好的解决方案,请告诉我。

【讨论】:

以上是关于在 Swift 2.1 中使用单例的主要内容,如果未能解决你的问题,请参考以下文章

单例在多线程中的使用

单例模式

单例模式(singleton)

单例模式(singleton)

单例模式你真的会了吗(上篇)?

如何通关设计模式之单例模式