1 MVVM中的Model和View
- Model是與UI無(wú)關(guān)的,它封裝了數(shù)據(jù)和應(yīng)用的邏輯,Model是基礎(chǔ)
- View是Model的映射,數(shù)據(jù)總是從Model流向View,View會(huì)盡可能的讓自己看起來(lái)能匹配上Model
- View中是沒(méi)有狀態(tài)的,所有關(guān)于界面的狀態(tài)應(yīng)該在Model里,View只會(huì)從從Model獲得狀態(tài)再顯示出來(lái)
-
Model和View是響應(yīng)式的,即Model改變后,會(huì)立刻影響View發(fā)生改變
MVVM通信
2. 命令式編程(imperative)和聲明式編程(Declarative)
- 命令式編程的劣勢(shì):依賴時(shí)間順序的執(zhí)行,
- 聲明式編程的優(yōu)勢(shì):和時(shí)間無(wú)關(guān),所有和UI相關(guān)的代碼都在一起
3 ViewModel層
- ViewModel層的工作用一句話總結(jié)就是:將View綁定在Model層上
- 我們希望View層中沒(méi)有復(fù)雜的邏輯和代碼,所以將這部分代碼(將Model層的數(shù)據(jù)轉(zhuǎn)換成View真正可用的數(shù)據(jù),比如將一種數(shù)據(jù)類型轉(zhuǎn)換成另一種數(shù)據(jù)類型)裝在了ViewModel層中。
-
Model層可能是一個(gè)簡(jiǎn)單的結(jié)構(gòu)體struct,也可能是一些數(shù)據(jù)庫(kù)sql語(yǔ)句,也可能是一些復(fù)雜的http網(wǎng)絡(luò)請(qǐng)求,ViewModel就可以將這些復(fù)雜的類型轉(zhuǎn)換成更加簡(jiǎn)潔可用的數(shù)據(jù)給View層使用,可以說(shuō)ViewModel就是一個(gè)翻譯官。
MVVM
3.1 從 Model ?? View 的步驟
- 第一步:觀察Model的變化。Swift語(yǔ)言可以使VM輕易知道Model層發(fā)生變化,無(wú)論Model是struct還是數(shù)據(jù)庫(kù)
- 第二步:“翻譯翻譯”。就是我們上面說(shuō)的將Model中的復(fù)雜數(shù)據(jù)轉(zhuǎn)換成簡(jiǎn)單可用的數(shù)據(jù)。
- 廣播“變化”:注意!ViewModel不會(huì)存任何指向View的指針!任意“訂閱”了View都可以接受到某個(gè)ViewModel發(fā)出的“廣播”,ViewModel不會(huì)直接和View進(jìn)行通信!
3.2 從 View ?? Model 的步驟
- View會(huì)通過(guò)方法(Intent Function)來(lái)呼叫ViewModel
- ViewModel再修改Model
-
當(dāng)Model被修改,就會(huì)進(jìn)入到3.1的步驟
View ?? Model
4 Swfit中的6個(gè)類型概念
4.1 結(jié)構(gòu)體(Struct) 和 類(Class)
- struct的可變性必須被指明,使用了let修飾后就不能改變它,比如當(dāng)你使用
let arr = ["apple","banana","orange"],由于數(shù)組Array也是一個(gè)struct,這時(shí)你就不能向里面添加元素。而class永遠(yuǎn)時(shí)可變的,通過(guò)指針可以在內(nèi)存中任意修改class -
ViewModel層必須是Class,因?yàn)閂iewModel需要被共享,可能有很多個(gè)View都需要利用同一個(gè)Model數(shù)據(jù),所以他們共用一個(gè)ViewModel,而View是一種protocol,其他的都盡量選擇struct
struct和class的區(qū)別
4.2 泛型(generic)
-
泛型是當(dāng)我們處理某個(gè)函數(shù)時(shí),但我們又不關(guān)心它參數(shù)的具體類型時(shí),此時(shí)用到的一個(gè)類似占位符的類型。 數(shù)組是一個(gè)很好的例子,數(shù)組的功能是存儲(chǔ)一串?dāng)?shù)據(jù),但我并不關(guān)心我存儲(chǔ)的是一串Int,一串String,或者一串Array。
用數(shù)據(jù)解釋泛型 如上圖所示,Array<Element>,尖括號(hào)表示這里用到了泛型,而Element則是這個(gè)泛型在內(nèi)部使用的名字,就如同一個(gè)占位符,在真正使用的時(shí)候?qū)⑺械腅lement替換成了我規(guī)定的類型。比如:
var a = Array<Int>()
a.append(5)
a.append(22)
實(shí)際上,Element在使用時(shí)被替換成了Int。當(dāng)然,在一個(gè)函數(shù)里面可以有多個(gè)泛型,只要被包在在尖括號(hào)里面即可。
4.3 函數(shù)(Function)
-
函數(shù)也是一種類型,在任意其他類型允許的地方使用函數(shù),函數(shù)和Bool,View,或者Array<Int>一樣,都是類型。
Function可以用在任意地方 -
可以將function作為屬性的類型,如下圖所示
Function的用法






