Swift đã giới thiệu một khái niệm mới là Optionals. Vậy Optionals là gì?
Optional là một khái niệm đặc biệt trong Swift dùng để xử lý việc thiếu giá trị (absence of value — của variable, const, object…)
Thiếu giá trị là gì? Trong Objective-C, khi muốn thể hiện biến hay object nào đó không có giá trị (value) nào cả thì ta sẽ set chúng bằng “nil”, hay trong các ngôn ngữ khác là “Null”.
Nhưng trong Swift, việc set một object thành “nil” là không thể, thay vào đó, ta sử dụng Optional.
Quay trở lại với câu hỏi “Optionals là gì”, ta có thể hiểu một cách dân dã hơn như sau:
Optional giống như cái hộp quà, có thể trong hộp có quà (optional bao hàm value), mà cũng có thể là không có (optional bao hàm nil). Cái hộp quà (tức optional) lúc nào cũng tồn tại, nhưng quà (value) thì có thể có, cũng có thể không.
Cách khai báo một biến dưới dạng Optionals:
Tại sao lại sinh ra Optionals?
Swift sinh ra là để thay thế cho Objective-C, nên về mặt nào đó nó phải tốt hơn Objective-C. Và có lẽ, Optionals là để đảm bảo tính an toàn hơn của Swift so với Objective-C (Swift được gọi là type safe language :v)
Xem ví dụ sau
Ví dụ trên là tạo array chứa danh sách các String, trong đó có String sẽ bị nil. Với Objective-C thì compiler không báo lỗi khi add thêm biến có giá trị nil vào array, do đó khi run time sẽ bị crash (vì không thể add nil vào array). Tuy nhiên, với Swift thì compiler đã báo lỗi Optional type String? chưa được “unwrapped” -> Báo lỗi trong quá trình compile.
Khi sử dụng Optionals, coder luôn được nhắc đến việc “unwrapped” — mở hộp — một biến để sử dụng (đảm bảo coder luôn chú ý đến việc chắc chắn rằng biến đó có bị nil hay không)
Làm thế nào để sử dụng giá trị của biến dạng Optionals?
Unwrapping Optionals — hay còn gọi là mở hộp lấy quà :v
Các phương pháp unwrapped optionals
Force unwrapping: sử dụng dấu “!” sau biến optionals:
Khi sử dụng cách làm này, phải luôn chắc chắn rằng biến có values, nếu không sẽ gây crash chương trình (run time error: fatal error: unexpectedly found nil while unwrapping an Optional value)
Optional binding: sử dụng “if let” hoặc “if var” để kiểm tra nếu như biến có gía trị thì unwrap và sử dụng giá trị của biến, nếu không thì thôi, ví dụ:
Cách làm này an toàn hơn vì luôn đảm bảo biến được kiểm tra xem có giá trị hay không trước khi sử dụng, tránh các trường hợp crash chương trình đáng tiếc.
Về quan điểm cá nhân thì tốt nhất là nên dùng Optional binding khi thao tác với các biến dạng Optionals, dài hơn một chút, nhưng an toàn hơn.
Tổng kết lại: Optionals là khái niệm mới trong Swift dùng để xử lý việc biến không có giá trị. Khai báo biến dưới dạng Optionals bằng cách thêm “?” vào sau type của biến. Và nên dùng Optionals binding để lấy giá trị của biến optionals.
!