我正在尝试找出适合在Swift中使用的单例模型.到目前为止,我已经能够得到一个非线程安全模型:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Run Code Online (Sandbox Code Playgroud)
在Static结构中包装单例实例应允许单个实例在没有复杂命名方案的情况下不与单例实例发生冲突,并且它应该使事情变得相当私密.显然,这个模型不是线程安全的,所以我尝试将dispatch_once添加到整个事情中:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
static var token: dispatch_once_t = 0
}
dispatch_once(Static.token) { Static.instance = TPScopeManager() }
return Static.instance!
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到一个编译器错误dispatch_once:
无法将表达式的类型'Void'转换为'()'类型
我已经尝试了几种不同的语法变体,但它们似乎都有相同的结果:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
Run Code Online (Sandbox Code Playgroud)
dispatch_once使用Swift 的正确用法是什么?我最初认为问题出在块中,因为dispatch_once错误消息,但我看的越多,我认为可能是获得() …
在比较这两个用于定义实例属性的选项时:
var networkManager = NetworkManager.sharedInstance()
var lazy networkManager = NetworkManager.sharedInstance()
都:
懒:
不懒:
似乎使用非惰性变量没有任何好处.那么为什么语言允许程序员做出这个低劣的选择呢?
(我不是在询问var和let la la之间的区别是默认的Swift常量是懒惰的吗?)
我是初学者,我有点理解Lazy Var vs. Let.我注意到,当使用Lazy Var时,特别是使用ImageViews,可以节省大量的内存使用量.但是到目前为止我看过的教程和指南并没有经常使用Lazy Var,所以我很怀疑它是不好的做法而且我忽略了一些东西.
我做了一点研究,得知Lazy不是"线程安全",但我不明白这意味着什么.我已经看到了很多优点和缺点,但我无法得出任何结论,特别是因为我的知识非常有限.
什么时候(或更好)在创建UIView时使用Lazy Var vs. Let?
lazy var profileImageView: UIImageView = {
let imageView = UIImageView(image: #imageLiteral(resourceName: "page1"))
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.contentMode = .scaleAspectFit
return imageView
}()
Run Code Online (Sandbox Code Playgroud)