Skip to content
  • Home
  • Code
  • iOS & Swift
  • Combine
  • RxSwift
  • SwiftUI
  • Flutter & Dart
  • Tutorials
  • Art
  • Blog
Fx Studio
  • Home
  • Code
  • iOS & Swift
  • Combine
  • RxSwift
  • SwiftUI
  • Flutter & Dart
  • Tutorials
  • Art
  • Blog
Written by chuotfx on May 8, 2020

Nâng tầm Optional Binding trong Swift

iOS & Swift

Contents

  • Chuẩn bị
  • 1. Optional Binding với “If let”
  • 2. The standard implementation of optionals
  • 3. Implementing for Strings
  • 4. Implementing a Generic
  • Tạm kết

Bài viết này sẽ đem tới cho bạn một trải nghiệm về Optional Binding mới trong Swift. Bài viết sẽ không quá phức tạp và mang tính chất vui vẻ là chính. Vâng, chào mừng bạn đến với Fx Studio!

Chuẩn bị

Bạn chỉ cần sử dụng Playgroud là đủ rồi. Quan trong là bạn cần phải nắm được các điểm lý thuyết này trước.

  • Closure : Một khối lệnh được bọc lại và truyền đi như một biến.
  • Generics: Tái sử dụng lại trong function và với bất kì kiểu dữ liệu nào, thì nó vẫn hoạt động ngon cơm.
  • Optional: cho phép biến của bạn được vắng mặt dữ liệu của nó. Dễ hiểu là có thể nil. (tham khảo Basic Swift )
  • Optional Binding: là cách unwrap 1 đối tượng Optional một cách an toàn. Tránh việc chết chương trình.
  • String: là một kiểu dữ liệu. Nó là tập hợp các kí tự (Characters), hay được hiểu là 1 từ hoặc 1 câu.

1. Optional Binding với “If let”

Chúng ta sang phần chính thôi nào! Về Optional trong Swift, nó cũng như là một cuộc cách mạng lớn. Nó giúp các lập trình viên thoải mái tạo bugs nhiều hơn. Cũng chính vì đặc tính của nó là có thể nil. Nên nếu chúng ta không kiểm soát được, thì chương trình bạn chết như ngã rạ.

Và tất nhiên, chúng ta sẽ có cách phòng tránh. Và đây là cách mà bạn sẽ bắt gặp đầu tiên khi học Swift.

Ví dụ code:

let string: String? = "A String"

if let str = string {
  print (str)
}

Giải thích:

  • string là một biến kiểu Optional String
  • Nó được cấp phát giá trị là "A String"
  • Tạo một hằng số là str bằng cách gán string cho nó
  • Nếu việc tạo thành công thì sẽ print nó ra. Công việc kiểm tra đó được bỏ vào câu lệnh điều kiện if

Sử dụng lâu dần thì giới lập trình viên Swift gọi luôn công việc trên là If let. Nhưng tên gọi chính của nó là

Optional Binding

2. The standard implementation of optionals

Tiếp theo, bạn sẽ cùng mình khám phá thêm một chút nữa. Thật sự nó không như cách bạn đã biết. Bạn hãy xem đoạn code sau:

let string: String? = nil

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

Đây mới là bản chất thực sự của nó. Một đối tượng Optional sẽ trả về cho chúng ta 2 trường hợp:

  • .some là có
  • .none là không có

Suy cho cùng thì số lượng kí tự code nhiều hơn If let ,nên chắc mọi người không sử dụng nó. Lâu dần thì xem như em đó không tồn tại nữa rồi.

3. Implementing for Strings

OKAY! Giờ tới phần trở nên PRO hơn một xí. Ta có ý tưởng sau:

Tạo 1 function If let với cách xử lí Optional Binding mới kia.

Bạn tiếp tục tham khảo đoạn code sau:

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

Vẫn không có gì phức tạp. Ngoài việc, ta thêm 2 closure là 2 tham số để xử lí mà thôi. Xem tiếp cách sử dụng nào

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

iflet("valueString", thenFunc: {val in print(val)}, elseFunc: { print("Do else") } )

Nhìn qua thì cũng ngon lành phải không nào. Giờ bạn có thể khai báo nó thành 1 static function và dùng trong project của bạn. Hoặc biến nó thành 1 function trong extension cho một Class nào đó.

4. Implementing a Generic

Ở trên, chúng ta đang dùng với kiểu dữ liệu String. Tất nhiên, Optional không buông tha kiểu dữ liệu nào hết. Vì vậy, cần thêm một bước cuối cùng là nâng cấp function đó một lần nữa.

Generics sẽ là lựa chọn tiếp theo.

Bạn tham khảo tiếp đoạn code cải tiến function iflet của chúng ta.

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

Thay vì cố định 1 kiểu String, chúng ta sẽ dùng <T> và xem T tương tự như String. Mọi thứ còn lại sẽ không thay đổi nhiều. Bạn xem cách sử dụng với các kiểu dữ kiệu khác nhau:

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

iflet("valueString", thenFunc: {val in print(val)}, elseFunc: { print("Do else") } )

let temp: Int? = nil
iflet(temp, thenFunc: {val in print(val)}, elseFunc: { print("Do else") } )

 

OKAY! Trông xịn xò hơn rồi đó. Tới đây thì mình xin kết thúc bài viết này.

Tạm kết

  • Optional Binding theo phong cách của riêng bạn
  • Hiểu thêm một cách nữa trong Optional Binding

Cảm ơn bạn đã đọc bài viết này!

And Happy coding!

FacebookTweetPinYummlyLinkedInPrintEmailShares9

Related Posts:

  • KeyPath trong 10 phút - Swift
    KeyPath trong 10 phút - Swift
  • Sendable Protocol & @Sendable trong 10 phút - Swift 5.5
    Sendable Protocol & @Sendable trong 10 phút - Swift 5.5
  • Race Condition và giải pháp trong 10 phút - Swift
    Race Condition và giải pháp trong 10 phút - Swift
  • Cơ bản về async/await trong 10 phút - Swift 5.5
    Cơ bản về async/await trong 10 phút - Swift 5.5
Tags: basic ios tutorial, optional, Swift
Written by chuotfx

Hãy ngồi xuống, uống miếng bánh và ăn miếng trà. Chúng ta cùng nhau đàm đạo về đời, về code nhóe!

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Donate – Buy me a coffee!

Fan page

Fx Studio

Tags

Actor Advanced Swift api AppDistribution Asynchronous autolayout basic ios tutorial blog callback ci/cd closure collectionview combine concurrency CoreData Core Location crashlytics darkmode dart dart basic dart tour Declarative decoding delegate deploy fabric fastlane firebase flavor flutter GCD iOS mapview MVVM optional protocol rxswift Swift Swift 5.5 SwiftUI SwiftUI Notes tableview testing TravisCI unittest

Recent Posts

  • Raw String trong 10 phút
  • Dispatch Semaphore trong 10 phút
  • Tổng kết năm 2022
  • KeyPath trong 10 phút – Swift
  • Make color App Flutter
  • Ứng dụng Flutter đầu tiên
  • Cài đặt Flutter SDK & Hello world
  • Coding Conventions – người hùng hay kẻ tội đồ?
  • Giới thiệu về Flutter
  • Tìm hiểu về ngôn ngữ lập trình Dart

You may also like:

  • Race Condition và giải pháp trong 10 phút - Swift
    Race Condition và giải pháp trong 10 phút - Swift
  • async/await to Fetch REST API - Swift 5.5
    async/await to Fetch REST API - Swift 5.5
  • Swift Package - SwiftUI Notes #17
    Swift Package - SwiftUI Notes #17
  • Encoding và Decoding trong Swift
    Encoding và Decoding trong Swift
  • Generics trong 10 phút - Swift
    Generics trong 10 phút - Swift

Archives

  • February 2023 (1)
  • January 2023 (2)
  • November 2022 (2)
  • October 2022 (1)
  • September 2022 (5)
  • August 2022 (6)
  • July 2022 (7)
  • June 2022 (8)
  • May 2022 (5)
  • April 2022 (1)
  • March 2022 (3)
  • February 2022 (5)
  • January 2022 (4)
  • December 2021 (6)
  • November 2021 (8)
  • October 2021 (8)
  • September 2021 (8)
  • August 2021 (8)
  • July 2021 (9)
  • June 2021 (8)
  • May 2021 (7)
  • April 2021 (11)
  • March 2021 (12)
  • February 2021 (3)
  • January 2021 (3)
  • December 2020 (3)
  • November 2020 (9)
  • October 2020 (7)
  • September 2020 (17)
  • August 2020 (1)
  • July 2020 (3)
  • June 2020 (1)
  • May 2020 (2)
  • April 2020 (3)
  • March 2020 (20)
  • February 2020 (5)
  • January 2020 (2)
  • December 2019 (12)
  • November 2019 (12)
  • October 2019 (19)
  • September 2019 (17)
  • August 2019 (10)

About me

Education, Mini Game, Digital Art & Life of coders
Contacts:
contacts@fxstudio.dev

Fx Studio

  • Home
  • About me
  • Contact us
  • Mail
  • Privacy Policy
  • Donate
  • Sitemap

Categories

  • Art (1)
  • Blog (22)
  • Code (4)
  • Combine (22)
  • Flutter & Dart (24)
  • iOS & Swift (86)
  • RxSwift (37)
  • SwiftUI (76)
  • Tutorials (70)

Newsletter

Stay up to date with our latest news and posts.
Loading

    Copyright © 2023 Fx Studio - All rights reserved.

    Share this ArticleLike this article? Email it to a friend!

    Email sent!