在應用程序中,常常會獲取到一個結果值,而後對結果值進行處理。好比:網絡請求結束後獲取一個結果值,再講這個結果值進行加工,轉化爲咱們對應的實體類。編程
一般的寫法以下:swift
static func request(_ url: URL, completion: ((Data) -> Void)? = nil) {
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
completion?(data)
}
}.resume()
}
複製代碼
爲了說明問題,簡化了不少代碼。網絡
當網絡請求獲取到結果 data 以後,調用 completion 對 data 進行處理。app
能不能更近一步的簡化對應的代碼呢?在閱讀 URLNavigator 框架的時候,學了另外一種寫法,咱們看怎樣更進一步簡化代碼。框架
extension Data {
func apply(_ f: ((Data) throws -> Void)?) rethrows -> Void {
try f?(self)
}
}
static func request(_ url: URL, completion: ((Data) -> Void)? = nil) {
URLSession.shared.dataTask(with: url) { data, response, error in
data?.apply(completion)
}.resume()
}
複製代碼
首先對 Data 方法進行了擴展。在須要處理 Data 類型的數據時,就能夠將處理函數應用到擴展中 apply
方法上。達到進一步簡化代碼的目的。函數
對比這兩種方式,第一種更加的直觀,符合編程習慣;第二種能夠使代碼看起來更加簡潔,可是增長了閱讀代碼的難度。若是處理方法調用次數較多時,不妨試一下。post