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!

FacebookTweetPinYummlyLinkedInPrintEmailShares3

Related Posts:

  • [Vui] Hội chứng quá để tâm đến lỗi ngữ pháp
    [Vui] Hội chứng quá để tâm đến lỗi ngữ pháp
  • Task & Task Group trong 10 phút - Swift 5.5
    Task & Task Group trong 10 phút - Swift 5.5
  • Combine vs. MVVM – Binding
    Combine vs. MVVM – Binding
  • Cơ bản về Actor trong 10 phút - Swift 5.5
    Cơ bản về Actor 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!

Recent Posts

  • Set type – Dart tour
  • List type – Dart Tour
  • Null safety – Dart Tour
  • Classes & Objects – Dart Tour
  • Quick trong 10 phút
  • Nimble trong 10 phút
  • Functions – Dart Tour
  • Control Flow – Dart Tour
  • API Testing (UnitTest) with OHHTTPStubs
  • Flavor & Câu chuyện config trong Flutter

Fan page

Fx Studio

Archives

  • August 2022 (3)
  • 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)

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

You may also like:

  • Generics trong 10 phút - Swift
    Generics trong 10 phút - Swift
  • Opaque Type trong 10 phút - Swift
    Opaque Type trong 10 phút - Swift
  • RxCocoa Basic – Binding Observables
    RxCocoa Basic – Binding Observables
  • Realm Swift trong 10 phút
    Realm Swift trong 10 phút
  • Race Condition và giải pháp trong 10 phút - Swift
    Race Condition và giải pháp trong 10 phút - Swift

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 (20)
  • Code (4)
  • Combine (22)
  • Flutter & Dart (15)
  • iOS & Swift (83)
  • RxSwift (37)
  • SwiftUI (75)
  • Tutorials (69)

Newsletter

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

Copyright © 2022 Fx Studio - All rights reserved.

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

Email sent!