任何人都可以解釋下面的通用類“Active”究竟是什么與此系結變數一起使用?下面也提到了 3 個例子,但我真的不清楚它是如何作業的
class Active<T> {
var bind :(T) -> () = { _ in }
var value :T {
didSet {
bind(value)
}
}
init(_ v :T) {
value = v
}
}
例子 :
- var user = Active("")
- var 計數 = 活動(64)
- var 狀態 = 活動(真)
下面鏈接中顯示的確切示例
https://levelup.gitconnected.com/2-ways-to-execute-mvvm-ios-5c47d60ebcd0
uj5u.com熱心網友回復:
如果您熟悉完成處理程式,那么這對您來說非常有意義。考慮一個帶有準系統完成處理程式的函式:
func someFunction(completion: () -> Void) {
completion()
}
someFunction {
print("completion")
}
完成處理程式沒有引數,因此它被呼叫completion()并且閉包的捕獲串列someFunction { ... }為空。但是,如果我們要向這個完成處理程式添加一個引數,那么它將使用該引數呼叫,completion(true)并且閉包必須定義它的捕獲串列someFunction { (done) in ... }。
func someFunction(completion: (_ done: Bool) -> Void) {
completion(true)
}
someFunction { (done) in
print(done)
}
如果我們不關心完成處理程式中的布林值,那么我們可以在閉包的捕獲串列中忽略它:
someFunction { _ in
print("completion")
}
這就是bind一個帶有單個引數的閉包,它帶有一個不關心它傳遞的引數的捕獲串列。
var bind: (T) -> Void = { _ in }
所以這個想法是Active用一個值實體化,然后bind在值改變時給出一個閉包來執行。因此,當它發生變化時,您將某些任務與該值的變化系結在一起。
// instantiate
var count = Active(64)
// bind its change to a closure
count.bind = { _ in
// perhaps update the UI?
}
// later when the value changes, the closure is called and
// whatever task you had in the closure is executed
count.value = 128
并且,作為旁注,T它只是一個任意字母(可以是??),用作實體化該物件時實際使用的任何型別(即Int,Bool)的占位符。不管T是什么,在使用這個物件的整個程序中它必須是相同的型別。
uj5u.com熱心網友回復:
您給出了Active使用不同型別的值進行實體化的示例(說明了通用行為)。但是你并沒有利用提供的“觀察者”模式Active。
讓我們看看你會如何使用Active:
let foo = Active(0)
foo.bind = { value in
print(value)
}
foo.value = 1 // the closure will be called, printing the value
foo.value = 42 // the closure will be called again
這個想法是你實體化物件,bind用你自己的閉包替換閉包,然后每次更改值時都會呼叫閉包。
這種“觀察者”模式的優點Active是提供了一種機制(在這個原始示例中是一個簡單的閉包)以允許其他物件觀察值的變化。這是 MVVM 的核心原則之一(正如您參考的那篇文章試圖傳達的那樣),即您可以撰寫代碼,例如,根據模型的更改自動更新視圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381135.html
上一篇:標簽欄圖示不符合影像插入
