Tìm hiểu về Optional và Optional Binding trong Swift

Như các bạn đã biết là có 2 cách khởi tạo biến trong Swift là dùng từ khóa var hoặc let. Var cho phép chúng ta thay đổi giá trị khi khởi tạo, còn let thì không như vậy. Vậy câu hỏi đặt ra là khi nào chúng ta có thể gán giá trị nil cho một biến?

Với Swift 2 chúng ta có khái niệm mới là Optional, chúng ta hãy thử khởi tạo một biến optional:

Các bạn có thể thấy được biến count mình gán kiểu giá trị là Int? (có dấu chấm hỏi) thì chúng ta có thể gán giá trị nil cho biến count. Nếu bạn không khai báo có dấu ? thì trình biên dịch sẽ báo lỗi “Nil cannot be assigned to type Int”.

Nil là từ khóa khi bạn gán vào 1 biến thì nó sẽ không mang giá trị nào cả hoặc là khi bạn gán vào 1 đối tượng thì đối tượng đó sẽ tham chiếu tới rỗng (không có giá trị). Từ khóa này được dùng cho cả khi biến đó có kiểu giá trị là tham trị và tham chiếu.

Mình trích 1 đoạn trong tài liệu của Apple họ đưa ra về nil.

Các bạn hãy thử mở PlayGround lên và copy đoạn code này vào để xem chúng hoạt động như thế nào? Khi in ra kết quả là Optional(18) thì biến convertNumber có thể được gán với giá trị nên sẽ có thêm tiền tố Optional ở phía trước. Còn khi kiểm tra biến convertNumber có giá trị nil hay không thì nếu không phải nil chúng ta in ra và có dấu ! phía sau. Dấu ! này có nghĩa là chúng ta unwrapping cái biến đó ra khi nó chắc chắn không có giá trị nil.

Wrap (?) và Unwrap (!)

Wrap: Khi khai báo 1 biến với dấu ? thì biến đó sẽ được bọc an toàn trong 1 cái gói và sẽ giữ an toàn cho biến đó nếu biến đó là nil.

Unwrap: Nếu bạn khai báo 1 biến bằng với biến khác mà biến đó đang mang dấu ? (wrap) thì chương trình sẽ yêu cầu bạn chèn dấu ! để Unwrap để mở nó ra và mang giá trị đó. Còn nếu mình unwrap cái biến có giá trị là nil thì chương trình sẽ báo lỗi. (Đây là một tính năng trong swift).

Lợi ích: Giúp ứng dụng của chúng ta không crash khi bạn làm việc với các biến hoặc thuộc tính mang giá trị là nil.

Chúng ta có một cách nữa để kiểm tra xem biến đó có nil hay không bằng việc sử dụng Optional Binding:

Các bạn có thể thấy được lần này chúng ta lại không sử dụng dấu ! nhưng kết quả vẫn ra là 18 (không có Optional). Đối với Optional Binding thì nó sẽ chắc chắn biến tempNumber có giá trị nên khi convert thành công thì biến của number sẽ gán vào tempNumber nên sẽ có giá trị, vì thế chúng ta sẽ không cần unwrap nữa.

Vậy là mình đã giải thích xong về 2 khái niệm Optional và Optional Binding.

Hôm nay bạn đã làm được gì ý nghĩa chưa? Hay để thời gian trôi qua một cách lặng lẽ?

Leave a reply:

Your email address will not be published.