Swift - 尝试访问 Singleton 对象时出现问题
Swift - Issue trying to access to Singleton object
我正在尝试在我的应用程序上实现单例模式,但到目前为止没有成功。当我尝试访问我的单例时,程序似乎没有访问真正的单例,而是访问它的副本。由于此副本未初始化,我的应用程序崩溃,显示此错误:
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)")
}
}
如您所见,这非常简单。 class 有两个在创建时初始化的属性,它们在 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 中实现了 Singleton 模式的所有三种方法,正如在这个主题上所说:dispatch_once singleton model in swift,没有任何成功。
我不明白为什么我不能访问真正的 Singleton 而只能访问它的副本(这对 Singleton 模式不利)。
感谢您的帮助。
我认为,最终,您不会制作 UIViewController
的单例。您可能想要创建一个 class,例如 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
无论如何,请尝试更多地记录自己的单例模式:-)
我正在尝试在我的应用程序上实现单例模式,但到目前为止没有成功。当我尝试访问我的单例时,程序似乎没有访问真正的单例,而是访问它的副本。由于此副本未初始化,我的应用程序崩溃,显示此错误:
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)")
}
}
如您所见,这非常简单。 class 有两个在创建时初始化的属性,它们在 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 中实现了 Singleton 模式的所有三种方法,正如在这个主题上所说:dispatch_once singleton model in swift,没有任何成功。
我不明白为什么我不能访问真正的 Singleton 而只能访问它的副本(这对 Singleton 模式不利)。
感谢您的帮助。
我认为,最终,您不会制作 UIViewController
的单例。您可能想要创建一个 class,例如 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
无论如何,请尝试更多地记录自己的单例模式:-)