Swift避免在初始化程序中重复代码

时间:2016-04-29 12:30:51

标签: ios swift initialization

如何避免在初始化程序之间重复代码?我希望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)
}

4 个答案:

答案 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 {}
    }()
}