Tuple và Optional là 02 kiểu dữ liệu hoàn toàn mới mà trong Objective C không có. 02 kiểu dữ liệu này sẽ được sử dụng thường xuyên trong lập trình Swift, vì vậy các bạn lưu ý phần này nhé.
Tuple – Bộ giá trị
Như đã giới thiệu trong bài trước, Swift cung cấp cho chúng ta một kiểu dữ liệu mới đó là Tuples. Trong bài này mình sẽ tạm gọi là “bộ/nhóm giá trị” cho các bạn dễ hiểu.
Kiểu dữ liệu Tuple cho phép chúng ta lưu trữ nhiều giá trị bên trong một biến. Nghe có vẻ giống mảng, nhưng đây không phải mảng nhé các bạn. Khi một biến / hằng có kiểu Tuple thì biến / hằng đó chỉ là một biến / hằng giá trị thông thường mà thôi hoàn toàn không phải mảng. Nhưng nhờ khả năng đặc biệt này mà việc lập trình của chúng ta trong Swift được nhẹ nhàng hơn rất nhiều (ví dụ đối với những hàm cần trả về nhiều giá trị thì trước đây chúng ta thường hay làm nhất là trả ra thông qua những tham số đầu vào nhưng bây giờ thì không cần phải như vậy nữa, vì chúng ta đã có Tuple do đó chúng ta có thể trả về như một biến giá trị thông thường).
Các giá trị trong tuple có thể thuộc bất kỳ kiểu dữ liệu nào và không cần phải giống nhau.
Khai báo tuple
● Ví dụ: khai báo một hằng kiểu tuple và gán vào đó hai giá trị (một số nguyên, một chuỗi) cho hằng này.
● Nhận xét:
➠ Không chỉ định kiểu dữ liệu cho tuple, mà Swift sẽ tự hiểu thông qua giá trị được gán.
➠ Bộ giá trị của một tuple được bao trong cặp dấu ( ).
Truy xuất giá trị của tuple
Để truy xuất giá trị của một bộ giá trị, chúng ta dùng chỉ số để xác định vị trí giá trị muốn truy cập (bắt đầu từ vị trí 0).
Chúng ta cũng có thể đặt tên cho các giá trị con bên trong một bộ giá trị.
➠ Lúc này để truy xuất các giá trị con bên trong, chúng ta sử dụng dấu chấm “.”
Phân tách biến tuple
Chúng ta cũng có thể phân tách một bộ giá trị bất kỳ thành các biến hoặc hằng số riêng biệt.
Trong một số trường hợp nếu chỉ cần phân tách một hoặc vài giá trị trong một bộ giá trị và bỏ qua một vài giá trị khác trong bộ giá trị thì chúng ta dùng ký tự gạch dưới (_) để bỏ qua những giá trị không mong muốn.
Kiểu dữ liệu Optional
➠ Đối với biến hoặc hằng số thông thường không được phép gán “rỗng” (nil) mà phải có một giá trị xác định. Nếu biến khai báo mà không gán giá trị thì nó vẫn tự tạo giá trị mặc định, ví dụ Int thì mặc định là 0. Còn biến optional thì không gán mặc định là 0 nữa mà sẽ gán là nil.
➠ Thông thường chỉ có thể gán nil cho một lớp đối tượng mà không thể gán nil cho một kiểu dữ liệu cơ bản, nhưng Swift hỗ trợ điều này.
➠ Điều này sẽ khá tiện trong việc kiểm tra giá trị. Ví dụ trước đây đối với Int thì ta thường khai báo i:Int = -1 để cho biết hiện tại chưa có vị trí nào trong mảng. Nhưng bây giờ ta có thể gán trực tiếp là nil mà không cần gán giá trị -1 như một biến cờ nữa.
➠ Thực ra cái này không mới mà nó giống lớp đối tượng trong C# được gán null. Thường thì chỉ lớp đối tượng được gán null còn biến số thông thường không được gán null. Nhưng Swift lại hỗ trợ gán null cho biến số dữ liệu thông thường.
Khai báo
Để khai báo một biến hoặc hằng số có kiểu dữ liệu Optional, chúng ta thêm ký tự “?” đằng sau kiểu dữ liệu cở sở.
➠ Ví dụ: Khai báo biến Int dạng Optional
Chúng ta sử dụng và truy xuất giá trị như với biến/hằng thông thường.
➠ Ví dụ: kiểm tra biến index có rỗng hay không với cách thức sau:
➠ Trong ví dụ trên, nếu chúng ta kiểm tra biến Int thông thường với nil thì sẽ gặp lỗi. Trường hợp này là biến Optional nên cho phép so sánh với giá trị nil.
Forced Unwrapping
Nếu chắn chắn biến hoặc hằng số luôn có giá trị (không nil) thì thêm ký tự “!” sau tên biến để truy xuất giá trị, lúc này hệ thống sẽ unwrap (mở) biến optional thành biến giá trị thông thường để lấy giá trị.
Tuy nhiên nếu không chắc chắn giá trị sẽ luôn luôn không nil thì không sử dụng ký tự “!” vì lúc này chương trình sẽ gặp lỗi. Còn nếu chắc chắn không nil thì truy xuất trực tiếp giá trị sẽ giúp hệ thống nhẹ nhàng hơn.
➠ Ví dụ:
Optional Binding
Dùng cấu trúc if hoặc while để kiểm tra biến Optional.
➠ Ví dụ: sử dụng cấu trúc if để kiểm tra biến Optional có dữ liệu hay không như sau.
➠ Ví dụ trên có thể được đọc như thế này: “nếu y khác nil, gán giá trị y vào x và thực thi A(x), điều này sẽ đảm bảo rằng x là một đối tượng không nil”.
Chúng ta cũng có thể unwrap nhiều biến Optional với cấu trúc điều kiện so sánh như sau:
Tổng kết
Trong phần này mình đã trình bày tới các bạn 02 kiểu dữ liệu mới mà swift cung cấp. Nếu các bạn có ý định tìm hiểu một cách nghiêm túc thì nên học kỹ phần này. Bởi lập trình Swift sẽ rất hay sử dụng 02 kiểu dữ liệu này và đặc biệt là Optional. Trong khuôn khổ bài viết có thể có những ý mình chưa diễn đạt hết hoặc còn thiếu sót. Bạn nào có gì thắc mắc thì cứ comment bên dưới bài viết nhé.
Int ở đây không phải kiểu dữ liệu cơ bản mà là 1 Wrapper class nên có thể gán nil (hay null) bình thường. Chắc bạn có nhầm lẫn chút.
Mình đâu nói là Int không thể gán nil (hay null) đâu nhỉ? Có lẽ do bạn đọc bài viết chưa kỹ.