MVC 架構介紹
基本概念
- M:模型(Model),檢視類所需的資料,如:列表展示的資料。
- V:檢視(View),構建UI的類,如:button、label、imageView等。
- C:控制器(Controller),連線檢視類和模型類,任務是使資料顯示在螢幕上。如:控制器將表格需要使用的資料“填入”表格檢視中,將表格檢視顯示出來。
通訊方式
MVC 通訊方式如下圖所示:
由上圖可以看出:
- Controller可以直接訪問Model
- Controller可以直接訪問View
- View、Model兩者不能相互訪問
1. View到Controller的通訊
目標動作機制(target-action)
:標準化匿名通訊,使用者與檢視互動觸發控制器的方法。例如:點選按鈕後實現視介面跳轉,網路請求,重新整理UI等。代理機制(delegate)
:有更復雜的通用UI元件,比如一個UIScrollView
滑動至最底部,需要告訴Controller
並詢問,還能繼續滾動嗎?資料來源機制(dataSource)
:列表檢視(tableView
)不能處理資料,需要Controller
來幫助處理資料。如:資料儲存在Model,Controller訪問Model,取出資料給tableView展示。
2. Model到Controller的通訊
類似電臺機制的兩種模式:
- 通知(Notification)
- 鍵值監聽(KVO,Key Value Observe)
結構體(struct)
在C
語言中結構體(struct)
就是某種儲存少量資料的型別,不是什麼重要的東西。但在Swift
中struct
和類(class)
基本是一樣的,它們都可以有方法、有變數。
不過它們也是有區別的,主要有兩點:
struct
沒有繼承,所以比class
簡單一些struct
是值型別,而class
是引用型別
值型別:
當我們把它作為引數傳入函式、放入陣列中,亦或者把賦值給另一個變數,它都會被拷貝。
引用型別:
它們被儲存在堆(heap)中,保留指向它的指標,當傳遞它的時候,不會把物件四處傳遞,
傳遞的只是指標。我們可能有很多程式碼,都擁有指向同一個物件的指標。
複製程式碼
懶載入(lazy)
意味著不會被初始化,直到有需要時才會被初始化。
運算子
1. for...in
// 半開區間運算子
for index in 0..<[Any].count { // do something }
// 閉合區間運算子
for index in 0...[Any].count { // do something }
// 以上兩種均可寫成
for index in [Any].indices { // do something }
複製程式碼
indices
:按升序對收集進行下標的索引。返回的是CountableRange<Int>
2. 三目運算子
a > b ? a : b
複製程式碼
3. 比較運算子
a == b 等於
a != b 不等於
a > b 大於
a < b 小於
a >= b 大於等於
a <= b 小於等於
複製程式碼
注意: Swift
也提供恆等(===
)和不恆等(!==
)這兩個比較符來判斷兩個物件是否引用同一個物件例項。
4. 控制流
比較運算都返回了一個標識表示式是否成立的布林值(bool):
if a == b {
// do something
} else {
// do something
}
複製程式碼
Type(static)Method
static var identifierFactory = 0
static func getUniqueIdentifier() -> Int {
identifierFactory += 1
return identifierFactory
}
複製程式碼
屬性觀察(Property Observer)
didSet
var flipCount: Int = 0 {
didSet {
flipCountLabel.text = "Flips: \(flipCount)"
}
}
複製程式碼
小結
以上基本就是第一堂課的知識點,值得注意的是,struct
和class
的區別很重要。
Array、Int、Dictionary等都是結構體,傳遞時會被拷貝。
可選型別(Optional):
- 有值
- 無值(nil)
應該特別注意,否則很容易導致程式crash。