天天看點

斯坦福iOS Swift開發公開課總結(一)MVC 架構介紹結構體(struct)懶加載(lazy)運算符Type(static)Method屬性觀察(Property Observer)小結

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。