函數和閉包
函數是獨立的可重復使用的功能模塊,如果程序中出現了大量的重復代碼,通常都可以將這部分功能封裝成一個獨立的函數。在Swift中,函數是"一等公民",可以作為類型來使用,也就是說函數可以賦值給一個變量或常量,可以將函數作為函數的參數或者返回值,還可以使用高階函數。
func 函數名([參數1: 類型, 參數2: 類型, ...]) [throws|rethrows] [-> 返回類型] {
函數的執行體
[return 表達式]
}
- 外部參數名
- inout參數
- 可變參數列表
閉包就是沒有名字的函數(匿名函數)或者稱之為函數表達式(Lambda表達式),Objective-C中與之對應的概念叫block。如果一個函數的參數類型是函數我們可以傳入一個閉包;如果一個函數的返回類型是函數我們可以返回一個閉包;如果一個類的某個屬性是函數我們也可以將一個閉包表達式賦值給它。
{ ([參數列表]) [-> 返回類型] in 代碼 }
面向對象編程(OOP)
基本概念
對象:接收消息的單元,對象是一個具體的概念。
類:對象的藍圖和模板,類是一個抽象概念。
消息:對象之間通信的方式,通過給對象發消息可以讓對象執行對應的操作來解決問題。
四大支柱
抽象:定義類的過程就是一個抽象的過程,需要做數據抽象和行為抽象,數據抽象找到對象的屬性(保存對象狀態的存儲屬性),行為抽象找到對象的方法(可以給對象發的消息)。
封裝:
- 觀點1: 我們在類中寫方法其實就是在封裝API,方法的內部實現可能會很復雜,但是這些對調用這來說是不可見的,調用只能看到方法有一個簡單清晰的接口。
- 觀點2: 將對象的屬性和操作這些屬性的方法綁定在一起。
- 觀點3: 隱藏一切可以隱藏的實現細節,只提供簡單清晰的接口(界面)。
面向協議編程(POP)
協議
protocol 協議名[: 父協議1, 父協議2, ...] {
// 方法的集合(計算屬性相當于就是方法)
}
- 能力:
- 約定:
- 角色:
依賴倒轉原則
用協議實現委托回調
一個對象想做某件事情但是自身沒有能力做這件事情就可以使用委托回調,具體的步驟是:
- 設計一個協議,讓被委托方遵循協議并實現協議中的方法
- 委托方有一個屬性是協議類型的,通過該屬性可以調用協議中的方法
注意:委托方的協議類型的屬性通常是可空類型,因為要寫成弱引用(weak)。
其他
- 協議組合:protocol<協議1, 協議2, ...>
- 可選方法
- 協議擴展:對協議中的方法給出默認實現