在 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 中使用单例的主要内容,如果未能解决你的问题,请参考以下文章