SwiftUI No.2 MVVM

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 的步驟

  1. 第一步:觀察Model的變化。Swift語(yǔ)言可以使VM輕易知道Model層發(fā)生變化,無(wú)論Model是struct還是數(shù)據(jù)庫(kù)
  2. 第二步:“翻譯翻譯”。就是我們上面說(shuō)的將Model中的復(fù)雜數(shù)據(jù)轉(zhuǎn)換成簡(jiǎn)單可用的數(shù)據(jù)。
  3. 廣播“變化”:注意!ViewModel不會(huì)存任何指向View的指針!任意“訂閱”了View都可以接受到某個(gè)ViewModel發(fā)出的“廣播”,ViewModel不會(huì)直接和View進(jìn)行通信!

3.2 從 View ?? Model 的步驟

  1. View會(huì)通過(guò)方法(Intent Function)來(lái)呼叫ViewModel
  2. ViewModel再修改Model
  3. 當(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的用法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容