如何避免在初始化程序之间重复代码?我希望dateFormatter保持let常量。
let dateFormatter: NSDateFormatter
init() {
dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = .MediumStyle
dateFormatter.timeStyle = .MediumStyle
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = .MediumStyle
dateFormatter.timeStyle = .MediumStyle
super.init(coder: aDecoder)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = .MediumStyle
dateFormatter.timeStyle = .MediumStyle
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
答案 0 :(得分:9)
如果真的,实际代码会用
替换整个代码lazy var dateFormatter : NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateStyle = .MediumStyle
formatter.timeStyle = .MediumStyle
return formatter
}()
该变量在第一次访问时被懒惰地初始化
编辑:在没有lazy属性的情况下,也可以将变量声明为常量。
let dateFormatter : NSDateFormatter = { ...
不同之处在于格式化程序是在实例初始化期间立即创建的(不懒惰)。
修改强>
在Swift 3中NSDateFormatter
已重命名为DateFormatter
和.MediumStyle
到.mediumStyle
答案 1 :(得分:3)
在这种情况下,你可以the Mozilla docs。
然后您的财产声明变为:
let dateFormatter: NSDateFormatter = {
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = .MediumStyle
dateFormatter.timeStyle = .MediumStyle
return dateFormatter
}()
您可以从初始化程序中删除日期格式化程序位。
答案 2 :(得分:0)
这是我能想到的唯一方法:
class Sample: UIViewController {
let dateFormatter: NSDateFormatter = NSDateFormatter()
init() {
super.init(nibName: nil, bundle: nil)
setupDateFormatter()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupDateFormatter()
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
setupDateFormatter()
}
private func setupDateFormatter() {
dateFormatter.dateStyle = .MediumStyle
dateFormatter.timeStyle = .MediumStyle
}
}
答案 3 :(得分:0)
如果你需要设置一个房产,那么我会选择vadian的方式。但是你的设置代码需要一些程序,如准备复杂的直接结构或准备图像缓存,然后我喜欢去懒惰的var闭包技巧。这个设置闭包只执行一次,就像任何其他lazy var属性初始化一次一样。所以你可以在这里编写相当复杂的程序代码。不要忘记添加private
,那么您的子类不会干扰您的业务。
class MyViewController: NSViewController {
init() {
super.init(nibName: nil, bundle: nil)!
self.setup()
}
override init?(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
override func encodeWithCoder(aCoder: NSCoder) {
super.encodeWithCoder(aCoder)
}
lazy private var setup: ()->() = {
// do some complex procedure here!!
return {}
}()
}