Optional trong Swift
Optional là gì ?
Nói một cách vắn tắt, Optional là một tính năng rất mạnh mẽ của Swift để giúp chương trình trở nên an toàn và ít bị crash hơn.Optional hoạt động dựa trên nguyên tắc sự vắng mặt giá trị. Chúng ta sử dụng Optional cho một biến hoặc hằng nào đó khi biến/hằng đó có thể có giá trị hoặc không. Nói nôm na, chúng ta có thể xem biến/hằng là trái táo, thì Optional giống như một cái hộp đựng táo, sẽ có hai khả năng xảy ra khi chúng ta mở hộp, một là trong hộp có táo, hai là trong hộp chả có gì cả.
Kí hiệu của Optional là Optional với T là kiểu dữ liệu, để ngắn gọn hơn người ta dùng kiểu viết tắt là T?
Một biến có kiểu Optional (hay Int?) có nghĩa là biến đó có thể có giá trị là một số nguyên, hoặc là nil.
Còn một biến có kiểu Int thì chỉ có thể có giá trị là một số nguyên.
Đặc tính
- Optional cho phép chúng ta gán biến bằng nil.
Đối với trường hợp không phải Optional, chúng ta không thể gán biến bằng nil:
- Khi không đặt giá trị mặc định, biến Optional có giá trị khởi tạo là nil.
Khi không đặt giá trị mặc định, biến không phải Optional không có giá trị khởi tạo nào cả.
Force Unwrapping (!)
Khi chúng ta khai báo và sau đó sử dụng biến Optional, compiler sẽ ngay lập tức báo lỗi:Force unwrapping là việc chúng ta cam đoan với trình biên dịch rằng một biến optional nào đó CHẮC CHẮN CÓ GIÁ TRỊ, giống như việc chúng ta mở hộp táo (unwrapping) khi đoan chắc trong hộp đó có táo vậy.
Để force unwrapping một biến Optional, ta sử dụng dấu ! phía sau biến đó.
Sau khi chạy đoạn code trên, biến surveyAnswer có kiểu dữ liệu là Optional nên có giá trị là Optional(“No”). Để lấy được giá trị thực của surveyAnswer, vì chúng ta biết chắc chắn là surveyAnswer có giá trị nên chúng ta sẽ unwrap nó:
Optional Binding
Cũng như forced unwrapping, optional binding cũng là một cách để “mở hộp táo”. Chúng ta sử dụng optional binding để kiểm tra xem một optional có chứa giá trị hay không, nếu có thì unwrap và gán giá trị đó vào 1 biến tạm hoặc hằng tạm.Optional binding có thể sử dụng với từ khoá if hoặc while, thông dụng hơn cả là if let và if var.
Implicitly Unwrapped Optional
Với một biến kiểu Optional, muốn dùng nó ta phải forced unwrapping (hoặc optional binding), dùng bao nhiêu lần thì phải forced unwrapping bấy nhiêu lần. Đôi khi một biến ta biết có giá trị rồi mà cứ phải forced unwrapping nhiều lần thì cũng hơi phiền phức. Implicitly Unwrapped Optional sẽ giúp chúng ta giải quyết phiền phức này, ta chỉ cần forced unwrapping ngay lúc khởi tạo biến, rồi sau đó sử dụng thoải mái mà không cần phải forced unwrapping nữa.Chúng ta sử dụng Implicitly Unwrapped Optional cho một biến hoặc hằng nào đó khi biến/hằng đó chúng ta biết sẽ luôn luôn có giá trị và không bao giờ bị nil. Nói nôm na giống như một cái giỏ táo được đảm bảo sẽ có táo.
Kí hiệu của Implicitly Unwrapped Optional là ImplicitlyUnwrappedOptional với T là kiểu dữ liệu, để ngắn gọn hơn người ta dùng kiểu viết tắt là T!
Optional Chaining
Để hiểu Optional Chaining là gì chúng ta xem qua ví dụ sau:Thế nhưng nếu gặp phép toán number/2/3/4 + 1 thì sao, nếu vẫn dùng cách trên thì code của chúng ta sẽ rất nhiều dòng chỉ để thực hiện phép tính toán đơn giản. Vì thế mà Optional Chaining ra đời. Với việc sử dụng Optional Chaining, đoạn code thực hiện phép toán number/0 + 1 sẽ như sau:
Optional Chaining không chỉ áp dụng cho gọi lồng hàm như trên mà còn áp dụng cho truy vấn property và subscript.
Như vậy, Optional Chaining là một quá trình xử lý khi chúng ta gọi các hàm, truy cập các properties và subscripts của một optional. Quá trình xử lý đó là: Khi optional có giá trị, việc gọi hàm, truy cập property, subscript thành công và không có gì đáng nói. Khi optional đó bị nil, kết quả trả về của việc gọi hàm, truy cập property, subscript cũng là nil. Quá trình gọi, truy cập như trên có thể lồng nhau, và chỉ cần một lời gọi, truy cập trả về nil thì kết quả tổng thể cũng trả về nil ngay và luôn.
Kết luận
Có quá nhiều thuật ngữ, tính năng liên quan đến optional, vậy khi code phải dùng cái nào? Chúng ta chỉ cần nhớ:- Trường hợp một biến nào đó chúng ta chắc chắn nó luôn có giá trị, không thể nil được thì chúng ta khai báo biến đó với kiểu Implicitly Unwrapped Optional.
- Trường hợp ngược lại, biến có thể bị nil, chúng ta khai báo với kiểu Optional. Sau đó tuỳ tình huống mà ta sẽ sử dụng Force Unwrapping hay Optional Binding.
- Dùng Optional Chaining để code được gọn và an toàn hơn.
Tham khảo
- The Swift Programming Languages.
- https://niviki.com/toan-tap-ve-optional-trong-swift/
- http://dev.ethanify.me/swift/swift-optionals-2
Nhận xét
Đăng nhận xét