Giới thiệu

Có nhiều cách để viết Enum hơn là làm bánh hay làm tình. Ở bài viết này mình sẽ trình bày một hướng đi, hi vọng mọi người sẽ like :D

Kiểu phổ thông

Chắc hẳn chúng ta thấy kiểu viết enum này rất quen thuộc, đặc biệt là đối với những ai dùng alamofire

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
enum Result<T> {
    case success(T)
    case failure(Error)
    
    public var value: T? {
        switch self {
        case .success(let v): return v
        case .failure: return nil
        }
    }
    
    public var error: Error? {
        switch self {
        case .success: return nil
        case .failure(let e): return e
        }
    }
}

và để sử dụng Result ta sẽ switch - case như này:

1
2
3
4
5
6
switch result {
case .success(let value):
 	// your code
case .failure(let error):
	// your code
}

Kiểu for fun

Mình không thích switch - case cho lắm, vậy nên sẽ “hack” chút theo ý mình thích. Ở enum vừa rồi, mình sẽ thêm 2 hàm:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
func isSuccess(complete: @escaping (T) -> Void) -> Result<T> {
    guard let value = self.value else {
        return self
    }
    
    complete(value)
    return self
}

func `else`(complete: @escaping (Error) -> Void) {
    guard let err = self.error else {
        return
    }
    
    complete(err)
}

Vậy là từ giờ mình có thể check kết quả theo cách sau

1
2
3
4
5
6
7
let r: Result<Int> = .success(10)

r.isSuccess { (value) in
    print("show value:", value)
}.else { (err) in
    print(err)
}