Swift 5 đã được ra mắt và có sẵn Xcode 10.2 bạn có thể tải xuống từ Mac App store. Bên cạnh sự ổn định của ABI, Swift 5 còn bao gồm nhiều tính năng như phạm vi mã hóa, các string thô, các enum tương lai và các kiểu result cá nhân ưa thích. 

Kiểu result là một enum bọc các cuộc gọi ngược thành công và lỗi. Hãy xem xét một tình huống khi người dùng truy cập một web API, API có thể trả về kết quả không đồng bộ (trạng thái thành công) hoặc có thể trả về một lỗi (trạng thái lỗi). Kiểu result mới có thể gói kết quả trong các trường hợp enum riêng biệt để nó dễ dàng truy cập cả hai trạng thái hơn. 

Tham khảo khóa lập trình di động từ căn bản đến nâng caokhóa iOS Swift 12 buổi tại Techmaster 

Thực hiện 

Trước khi dẫn ra web API chúng tôi sẽ thực hiện các mô hình trước. API chúng tôi sưsử dụng có sẵn tại: https://jsonplaceholder.typicode.com/posts Đây chỉ là một API gửi lại kết quả giả. Việc thực hiện của các mô hình được hiển thị dưới đây:

struct Post: Decodable {
    let title: String
    let body: String
}

enum NetworkError: Error {
    case domainError
    case decodingError
}

Mô hình Post được đánh dấu bằng Decodable có thể giúp chúng ta giải mã phản hồi và đưa vào mô hình. Enum NetworkError đại diện cho những trường hợp lỗi khác nhau mà chúng tôi có thể gặp phải trong suốt cuộc phiêu lưu networking của mình. Bây giờ chúng tôi có các mô hình đã được thực hiện, hãy cùng kiểm tra quy trình của hàm fetchPosts chịu trách nhiệm truy xuất tât cả các post từ web API nhé

func fetchPosts(url: URL, completion: @escaping (Result<[Post],NetworkError>) -> Void) {
    
    URLSession.shared.dataTask(with: url) { data, response, error in
        
        guard let data = data, error == nil else {
            if let error = error as NSError?, error.domain == NSURLErrorDomain {
                    completion(.failure(.domainError))
            }
            return
        }
        
        do {
            let posts = try JSONDecoder().decode([Post].self, from: data)
            completion(.success(posts))
        } catch {
            completion(.failure(.decodingError))
        }
        
    }.resume()
    
}

Như bạn thấy chúng tôi đang dùng kiểu result trong việc hoàn thành bao đóng. Kiểu result có hai loại. Đầu tiên là loại được trả lại trong trường hợp thành công và thứ hai là loại được trả về trong trường hợp thất bại. Sau đó chúng tôi đã gọi là hàm completion handler và gọi .success hay .failure dựa trên tình huống. 

Bây giờ chúng ta có thể bắt đầu với hàm fetchPosts.

let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!

fetchPosts(url: url) { result in
    
    switch result {
        case .success(let posts):
            print(posts)
        case .failure:
            print("FAILED")
    }
}

Đơn giản đúng không !