ios - 使用默认值初始化 ViewModel

标签 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)
}

最佳答案

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

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 的创建是一项相对昂贵的操作,除非必要,否则不应重复。

另请注意,使用您的方法,每次访问的日期都会不同。这种类型的功能最好描述为函数而不是属性。

关于ios - 使用默认值初始化 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44636746/

相关文章:

javascript - 如何在浏览器环境中没有触摸事件的情况下获取 Activity 触摸事件

swift - 如何在UIImage上添加阴影

wpf - 重构臃肿的 ViewModel

ios - SharkORM大数据同步流程

ios - getUserMedia 在 IOS 12.3 上未定义

ios - 删除电子邮件表上的自定义导航栏

ios - 如何刷新 CollectionView 中单元格内的按钮?

在每个循环中快速更改不同的标签 labelData

c# - 显示用于更改 ViewModel 状态的交替图像

wpf - Combobox.SelectedItem 绑定(bind)到嵌套属性