數據源類似於委託,只不過它的方法提供了供其他對像顯示的數據。Cocoa中帶有數據源的類主要有UITableView、UICollectionView、UIPickerView與UIPageView-Controller。對於每個類來說,數據源必須要正式使用數據源協議並實現必需的方法。
有些初學者對於數據源的必要性感到驚奇。為何表數據不是表的一部分?為何要有一些包含著數據的固定的數據結構?原因在於這種架構違背了一般性。使用數據源可以將顯示數據的對象與管理數據的對象分離開來,後者可以自由存儲和獲取所需的數據(參見第13章的模型—視圖—控制器)。唯一的要求就是數據源必須能快速提供信息,因為當需要顯示數據時會實時地向數據源請求數據。
另一個驚奇之處在於數據源不同於委託。但這又回到一般性問題了;這是一個選項而不是必需的。並沒有什麼理由限制數據源與委託不能成為同一個對象,大多數時候它們可能都是一樣的。實際上,在大多數情況下,數據源方法與委託方法可以密切配合;你可能都意識不到這種差別。
下面這個示例來自於我編寫的應用,它實現了UIPickerView,讓用戶可以根據自己輸入的階段數(「1階段」「2階段」等)來配置遊戲。前兩個是UIPickerView數據源方法;第3個是UIPickerView委託方法。它通過這3個方法向選擇器視圖提供內容。
extension NewGameController: UIPickerViewDelegate, UIPickerViewDataSource { func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1 } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return 9 } func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return "\(row+1) Stage" + ( row > 0 ? "s" : "") } }