2017-06-19 78 views
0

我對與我想更新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()) 
     } 
    } 
} 

這將初始化我的UI從State的默認值。但是對於dateLabelText我想在顯示UI之前用實際日期對它進行初始化。

在哪裏做正確的地方?我應該在ViewModel初始化器中去做嗎?

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

回答

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 s是一個相對昂貴的操作,除非必要,否則不應重複。

另請注意,使用您的方法時,每次訪問日期都會有所不同。這種類型的功能可能會更好地描述爲一種功能而不是屬性。

+0

好主意。謝謝。但我不明白,你爲什麼說日期應該是一種方法而不是財產? – Kobe

+0

每次調用'thing.date'時,都會格式化當前日期,因此每次訪問它時都會使用不同的DateTime。通常這種行爲類型更好地表達爲一種方法。屬性通常用於存儲和轉發定義的信息,而不是每次訪問時都會更改的信息。沒什麼大不了的,只是我的偏好:) – PeejWeej

+0

哦,好吧,我想你有一點。感謝您指出了這一點。 – Kobe