【问题标题】:Initialize ViewModel with defaults values使用默认值初始化 ViewModel
【发布时间】:2017-11-22 00:50:12
【问题描述】:

我有一个简单的 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)
}

【问题讨论】:

    标签: ios swift mvvm viewmodel


    【解决方案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,因此它只初始化了一次。 DateFormatters 的创建是一个相对昂贵的操作,除非必要,否则不应重复。

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

    【讨论】:

    • 好主意。谢谢你。但是我不明白,为什么说日期应该是方法而不是属性?
    • 每次调用thing.date 时,您都在格式化当前日期,因此每次访问它时都会使用不同的日期时间。一般来说,这种类型的行为更好地表达为一种方法。属性通常用于存储和传递定义的信息,而不是每次访问时都会更改的信息。没什么大不了的,只是我的喜好:)
    • 哦,好吧,我想你说得有道理。感谢您指出这一点。
    • 没问题。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2014-12-29
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多