使用默认值初始化 ViewModel
Initialize ViewModel with defaults values
我有一个简单的 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
s 是一项相对昂贵的操作,除非必要,否则不应重复。
另请注意,使用您的方法,每次访问的日期都会不同。这种类型的功能最好描述为函数而不是 属性。
我有一个简单的 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
s 是一项相对昂贵的操作,除非必要,否则不应重复。
另请注意,使用您的方法,每次访问的日期都会不同。这种类型的功能最好描述为函数而不是 属性。