處理結果值與結果值的處理

在應用程序中,常常會獲取到一個結果值,而後對結果值進行處理。好比:網絡請求結束後獲取一個結果值,再講這個結果值進行加工,轉化爲咱們對應的實體類。編程

一般的寫法以下: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

相關文章
相關標籤/搜索