MVC 架構介紹
基本概念
- M:模型(Model),視圖類所需的資料,如:清單展示的資料。
- V:視圖(View),建構UI的類,如:button、label、imageView等。
- C:控制器(Controller),連接配接視圖類和模型類,任務是使資料顯示在螢幕上。如:控制器将表格需要使用的資料“填入”表格視圖中,将表格視圖顯示出來。
通信方式
MVC 通信方式如下圖所示:
由上圖可以看出:
- Controller可以直接通路Model
- Controller可以直接通路View
- View、Model兩者不能互相通路
1. View到Controller的通信
-
:标準化匿名通信,使用者與視圖互動觸發控制器的方法。例如:點選按鈕後實作視界面跳轉,網絡請求,重新整理UI等。目标動作機制(target-action)
-
:有更複雜的通用UI元件,比如一個代理機制(delegate)
滑動至最底部,需要告訴UIScrollView
并詢問,還能繼續滾動嗎?Controller
-
:清單視圖(資料源機制(dataSource)
)不能處理資料,需要tableView
來幫助處理資料。如:資料存儲在Model,Controller通路Model,取出資料給tableView展示。Controller
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。