使用默认值初始化ViewModel

时间:2017-06-19 17:39:25

标签: ios swift mvvm viewmodel

我有一个简单的ViewModel的代码,我想用它来更新3个标签:

struct State {
    var timeLabelText: String?
    var timeLabelHidden: Bool
    var dayLabelText: String
    var dateLabelText: String
}

class ViewModel {
    var state: State = State(timeLabelText: nil, timeLabelHidden: true, dayLabelText: "Day 0", dateLabelText: "June 19, 2017") {
        didSet {
            callback(state)
        }
    }

    var callback: ((State) -> Void)

    init(callback: @escaping (State) -> Void) {
        self.callback = callback
        callback(state)
    }

    var date: String {
        get {
            let dateFormatter = DateFormatter()
            dateFormatter.dateStyle = .long

            return dateFormatter.string(from: Date())
        }
    }
}

这将使用State中的默认值初始化我的UI。但是对于dateLabelText我希望在显示UI之前用实际日期初始化它。

正确的地方在哪里?我应该在ViewModel初始化程序中执行此操作吗?

init(callback: @escaping (State) -> Void) {
    self.callback = callback
    state.dateLabelText = date  // add this here 
    callback(state)
}

1 个答案:

答案 0 :(得分:1)

我建议将其设为静态属性:

class ViewModel {
    var state: State = State(timeLabelText: nil, timeLabelHidden: true, dayLabelText: "Day 0", dateLabelText: ViewModel.date) {
        didSet {
            callback(state)
        }
    }

    var callback: ((State) -> Void)

    init(callback: @escaping (State) -> Void) {
        self.callback = callback
        callback(state)
    }

    static private var dateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .long
        return dateFormatter
    }()

    static var date: String {
        get {
            return dateFormatter.string(from: Date())
        }
    }
}

请注意,我还将dateFormatter分开,因此仅初始化一次。创建DateFormatter是一项相对昂贵的操作,除非必要,否则不应重复。

另请注意,根据您的方法,每次访问时日期都会有所不同。这种类型的功能可以更好地描述为功能而不是属性。