史丹佛iOS Swift開發公開課總結(一)

城北陶公發表於2018-04-07

MVC 架構介紹

基本概念

  • M:模型(Model),檢視類所需的資料,如:列表展示的資料。
  • V:檢視(View),構建UI的類,如:button、label、imageView等。
  • C:控制器(Controller),連線檢視類和模型類,任務是使資料顯示在螢幕上。如:控制器將表格需要使用的資料“填入”表格檢視中,將表格檢視顯示出來。

通訊方式

MVC 通訊方式如下圖所示:

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)就是某種儲存少量資料的型別,不是什麼重要的東西。但在Swiftstruct類(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)"
        }
    }
複製程式碼

小結

以上基本就是第一堂課的知識點,值得注意的是,structclass的區別很重要。

Array、Int、Dictionary等都是結構體,傳遞時會被拷貝。

可選型別(Optional):

  • 有值
  • 無值(nil)

應該特別注意,否則很容易導致程式crash。


相關文章