+1

Viết lại hàm if let trong Swift

Thuật ngữ:

Closure: Một khối chức năng khép kín có thể được truyền qua.
Generics: Các hàm và loại có thể tái sử dụng có thể hoạt động với bất kỳ loại nào (hoặc tập hợp con của một loại nhất định).
Optional: Swift giới thiệu các tùy chọn xử lý việc không có giá trị, chỉ đơn giản bằng cách khai báo nếu có giá trị hay không.
Optional Binding: Sử dụng if let để mở khóa optional một cách an toàn.
String: Tập hợp các ký tự, thường được coi là một từ hoặc câu.

Optional Binding: If let in Swift

Optional Binding nghĩa là nếu một biến optional có thể được lấy được giá trị khi sử dụng if let để biến đổi một biến optional thành một biến non-optional cùng giá trị. ví dụ:

let optionalString: String? = "A String"

if let str = optionalString {
    print (str)
}

Cài đặt If let

Chúng ta có thể cài đặt một phiên bản if let code (Optional Binding) như một hàm chức năng.
Chuẩn cài đặt của optionals:
Trước tiên chúng ta cần hiểu về cách optional hoạt động trong cấu hình mặc định của chúng.
Một optional String có thể phân giải thành .some hoặc .none, như được minh họa bằng đoạn đoạn code sau:

let nilString: String? = nil

switch nilString {
case .some(let val):
    print (val)
case .none:
    print ("this is nil")
}

Cài đặt if let cho kiểu String: Chúng ta có thể thực hiện if let sử dụng closures vì thế nếu String không phải là kiểu optional, ta có thể chạy elseFunc, nếu là nil thì chạy thenFunc:

func iflet(_ value: String?, thenFunc: (String) -> (), elseFunc: () -> ()) {
    switch value {
    case .some(let val):
        thenFunc(val)
    default:
        elseFunc()
    }
}

let nilString: String? = nil
iflet(nilString, thenFunc: {val in print(val)}, elseFunc: { print("Do else") } )
iflet("valueString", thenFunc: {val in print(val)}, elseFunc: { print("Do else") } )

Cài đặt Generics if let Ta có thể sử dụng chuẩn if let optional binding cho bất kì kiểu optional nào. Hiển nhiên là chúng ta muốn cài đặt generic if let để có thể hoạt động cho bất kì kiểu cụ thể nào.

func genIfLet<T>(_ value: T?, thenFunc: (T) -> (), elseFunc: ()-> ()) {
    switch value {
    case .some(let val):
        thenFunc(val)
    default:
        elseFunc()
    }
}

let nilString: String? = nil
genIfLet(nilString, thenFunc: {val in print(val)}, elseFunc: { print("Do else") } )

let nilInteger: Int? = 4
genIfLet(nilInteger, thenFunc: {val in print(val)}, elseFunc: { print("Do else") } )

Kết luận:

Viết phiên bản Optional Binding trong Swift không quá phức tạp và cho chúng ta hiểu thêm về những gì đang diễn ra trong Swift.

Reference: https://medium.com/swlh/re-implement-if-let-in-swift-d88a4b79de83


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí