Swift 3.0 Class Note — Closure & Search Display
Published in
4 min readSep 30, 2016
Presenter : Wei Wei
Closure
- Closure 是沒有名字的(func)函式
- Closure 在Swift是一個值,有型別,屬Reference Type
- 把函式寫成Closure的步驟:
- 1.把名字刪掉,存進一個變數
- 2.把參數和回傳值放進大括號裡面,加上關鍵詞”in”
// Func //
func addClosure (number1:Int, number2: Int) -> Int {
number1 + number2
return result
}
// Closure //
let addClosure: (Int, Int) -> Int = {
(number1:Int, number2: Int) -> Int in
let result = number1 + number2
return result
}
- Closure 可當某函式的參數
- Closure 可當某函式的回傳值
- Closure 不僅可回傳值,還可把附近的值回傳出去
- Closure 可以跟陣列配合使用
- Closure 簡寫步驟
- 如果已經知道參數跟回傳值的型別的話,可以省略closure裡的參數和型別
- 如果closure 有回傳值,而且程式碼是一行的話,可以省略return
- 可以用$0 或 $1 …等代表參數
- 如果closure 是最後一個參數的話,可以把closure 寫在小括號外面
- 如果closure 是唯一個參數的話,可以省略小括號
/// 篩選有文字”o”
import Foundation
fruitArray.filter({
(fruit: String) -> Bool in
return fruit.contains(“o”)
})
/// 省略版
fruitArray.filter{ $0.contains(“o”) }
git@github.com:dan12411/HelloClosureBasic.git
Search Display
- 架構上先有一個TableViewController (i.e. SearchTableViewController)
- 設定資料來源Array — appleProducts
- 設定Delegate的Section, Row, Cell
- 再來是重頭戲:
- 需要新增一UISearchResultsUpdating的protocol
- 需要新增一UISearchController用來執行搜尋工作的類別
- 需要新增一UITableViewController用來顯示搜尋結果
- 需要新增一Array儲存搜尋結果
- 實作UISearchResultsUpdating下的函式updateSearchResults產生搜尋結果&重新整理資料,會使用到optional binding 、 Array的filter方法 & lowercased
- TableDataSource部分
- 用if…else 區隔 SearchTableViewController & ResultTableController的資料
- viewDidLoad()部分
- 產生 searchController,指定用resultController顯示搜尋結果
- 連結SearchTableViewController
- 設定搜尋時,取消反灰
- 設定顯示搜尋結果的 tableView 負責告訴顯示結果的 tableView 要顯示什麼資料
- viewWillAppear()部分
- 把 tableView 降下 20
- 把搜尋欄加到Header