Trong bài viết trước chúng ta đã tìm hiểu về hằng và biếnmột số dữ liệu cơ bản mà swift hỗ trợ. Trong bài này, chúng ta sẽ áp dụng kiến thức đó để tìm hiểu thêm về các kiểu dữ liệu collections và tuples. Sau đó sẽ thực hành chúng với một số bài tập để hiểu rõ nó hơn.
Vậy các kiểu dữ liệu collection hỗ trợ cho trong swift những là gì? – Sets, Arrays và Dictionaries. Bây giờ chúng ta sẽ bắt đầu tìm hiểu kiểu dữ liệu arrays.


Để bắt đầu cho bài hướng dẫn này, các bạn nên sử dụng Xcode Playground để thực hành code theo các ví dụ trong bài, nó giúp bạn sẽ dễ hiểu và nhớ lâu hơn.


Chạy Xcode 10 trở lên, tạo mới một Playground và tiến hành học.

Arrays

Cũng tương tự như các ngôn ngữ khác C/C++, Objectivec-C. Mảng(Array) là tập hợp  các kiểu dữ liệu được sắp xếp theo một thứ tự nào đó và được truy xuất theo chỉ số(index).Nhưng có một vài điểm khác biệt quan trọng giữa mảng của Swift với các ngôn ngữ khác như sau.

Kiểu dữ liệu

Điểm khác biệt đầu tiên so với Objective-C, việc lưu trữ dữ liệu trong mảng luôn luôn lưu các kiểu dữ liệu giống nhau trong cùng một mảng. Ban đầu chúng ta có thể nghĩ nó là một hạng chế, nhưng không. Thực tế thì nó lại là một lợi thế quan trọng. Nhờ nó mà chúng ta biết chính xác được trong mảng đó chứa kiểu dữ liệu gì, để thuận lợi cho việc truy xuất, sử dụng về sau.
Sự khác biệt tiếp theo liên quan tới các kiểu dữ liệu được lưu trong mảng, Trong Objective-C chỉ có thể lưu được các Object vào mảng thôi. Còn với Swift thì phần này sẽ không giới hạng, chúng ta có thể lưu được hầu như các kiểu dữ liệu khác nhau như int, float, string,.. các object.

Khai báo(Declaration)

Chúng ta sẽ có một vài cách để tạo một mảng, chúng ta hãy tạo mới một playground trong Xcode để bắt đầu thực hành với các code ví dụ sau:

Ví dụ:

var array1: Array<String>

var array2: [String]

var array3 = ["Apple", "Pear", "Orange"]

Phía trên là 3 cách tạo ra một mảng string.
Ngoài cách trên thì để tạo một mảng có giá trị mặc định, người ta thường dùng cú pháp sau:

var a = [String](repeating: "Demo", count: 5)

Cách trên sẽ tạo ra một mảng có 5 phần tử có trị giống nhau là “Demo”.
Ban đầu các bạn sẽ thấy cú pháp này khá lạ nhưng dần dần chúng ta sẽ quen với nó thôi.
Để khởi tạo một mảng string rỗng ta có thể dùng cách sau:
Ví dụ:

var b = Array<String>()

var c = [String]()

Các bạn đùng lo lắng quá nhiều về cú pháp rồi dần dần chúng ta sẽ quen với nó nhanh thôi, chỉ cần thực hành nhiều một tý là sẽ hiểu hơn.
Vậy để khai báo một mảng có thể thay đổi được(mutability) ta sẽ dùng từ khoá var, ngược lại muốn tạo một mảng cố định ta sẽ dùng từ khoá let.

Ví dụ:

var array5 = ["Apple", "Pear", "Orange"]

let array6 = ["Apple", "Pear", "Orange"]

Mảng array5 chúng ta có thể thêm hay xoá hay chỉnh sửa được, còn màng array6 thì chúng ta chỉ có thể đọc nó thôi.

Truy xuất và chỉnh sửa giá trị trong mảng

Để truy xuất hay chỉnh sửa gì các giá trị của mảng chúng ta đều dùng chỉ số.

Ví dụ:

let value = array3[1]
print(value) // Pear

array3[1] = "Peach"
print(value)  // Peach

Chúng ta có thể cộng 2 hoặc nhiều mảng như sau:

let a = [1, 2, 3]

let b = [4, 5, 6]
 
let c = a + b

Lưu ý là các mảng muốn cộng lại phải cùng kiểu dữ liệu. Chúng ta có thể dùng += cho mảng như sau:

var a = [1, 2, 3]

a += [4]

Một số tính năng thường dùng với mảng như:

array3.append("Cherry") // thêm một phần từ vào mảng.

array3.count // đếm số lượng phần tử.

array3.insert("Prune", at: 2) // chèn phần tử vào vị trí.

array3.isEmpty // Kiểm tra mảng rỗng.

Dictionaries

Dictionary trong Swift cũng tường tự như trong Objective-C. Dùng để lưu trữ tập hợp các giá trị và mỗi giá trị sẽ được truy xuất theo key.

Kiểu dữ liệu

Cũng gần giống mảng, Dictionary sẽ lưu giá trị kèm theo một key để truy xuất nó. Thông thường các kiểu dữ liệu trong chung một dictionary sẽ giống nhau, để về sau dùng key truy xuất dễ dàng hơn khi biết chính xác kiểu dữ liệu của giá trị.

Khai báo(Declaration)

Khác với mảng, để khai báo một dictionary cần phải có key và value.

Ví dụ:

var dictionary1: Dictionary<String, Int>

var dictionary2: [String: Int]

var dictionary3 = ["Apple": 3, "Pear": 8, "Orange": 11]

Thông thường key sẽ mang kiểu dữ liệu là string. value là một kiểu dữ liệu bất kỳ, nhưng trong một dictionary phải giống nhau giữa các phần tử. Khi dùng var thì các biến dictionary trên có thể thay đổi các phần tử, ngược lại với khi dùng let.

Truy xuất và chỉnh sửa giá trị trong mảng

Tương tự như mảng, bên mảng sẽ dùng chỉ số, còn bên Dictionary sẽ dùng key như đã nói ở trên. Ví dụ:

let value = dictionary3["Apple"]
print(value)

var dictionary4 = [0: "Apple", 1: "Pear", 2: "Orange"]
let fruit = dictionary4[0]

Một số tính năng thường dùng với dictionary như:

dictionary4.removeValue(forKey: 0) // Xoá phần tử trong dictionary  với key 0.

// Khởi tạo và thêm phần tử trong dictionary 
var dictionary = [String: Int]()
 
dictionary["Oranges"] = 2
dictionary["Apples"] = 10
dictionary["Pears"] = 5
 
dictionary = [:]

Và còn khá nhiều tính năng khác nửa, các bạn có thể truy cập link sau để tìm hiểu.

Sets

Set cũng dùng để lưu trữ một tập hơp các giá trị, nhưng nó không có thứ tự giống như array và mỗi phần tử chỉ được thêm 1 lần vào trong Set.

Khai báo(Declaration)

Để làm việc với set chúng ta có một số đểm giống với array.

Ví dụ:

var set1: Set<String>

var set2 = Set<String>()

var set3: Set<String> = ["Apple", "Pear", "Orange"]

Nếu biến set dùng từ khoá var thì chúng ta có thể chỉnh sửa trị của biến đó.

Ví dụ:

set3.insert("Prune")

set3.remove("Orange")

set3.contains("Apple")

Vậy khi nào chọn dùng set hay Array.

Chúng ta để ý sẽ thấy set là một kiểu tập hơn đơn gian hơn so với mảng. Vì các phần tử trong set sẽ không có thứ tự và để đảm bảo các phần tử trong một tập hợp không bị trùng lặp thì chúng ta có thể dùng set. Những lý do trên cũng chính là lý do mà chúng ta thường dùng set.

Tuples

Chúng ta sẽ yêu thích Tuples, Tuples không phải là một kiểu tập hơn, mà nó chỉ tựa tựa kiểu tập hợp thôi. Nó là một nhóm nhiều giá trị và nó có thể chứa bất kỳ kiểu dữ liệu nào. Điểm khác biệt lớn ở đây là Tuples có thể chứa các kiều dữ liệu giống nhau. Để hình dung rõ hơn chúng ta sẽ tham khảo ví dụ sau:

Ví dụ:

mport Foundation
 
var currency = ("EUR", 0.81)
var time = (Date(), "This is my message.")
var email = ("Bart Jacobs", "bart@example.com")

Ví dụ trên là cách khai báo một tuples. Số phần tử trong một tuples có thể lên tới n phần tử, Nhưng không ai làm vậy sẽ rất rối dòng code, tối đã thì khoảng 5 phần tử đổ lại là đẹp cho một tuples.

Truy xuất dữ liệu.

Chúng ta có thể dùng chỉ số như sau:

var rate = currency.1

var message = time.1

var name = email.0

Chúng ta có thể truy xuất theo tên bằng cách khai báo như sau:

var currency = (name: "VND", rate: 0.81)

let currencyName = currency.name

let currencyRate = currency.rate

Có khá nhiều cách làm việc với tuples như có thể gián nó như sau:

let (currencyName, currencyRate) = currency

hoặc là

let (currencyName, _) = currency

Để nắm rõ bài hơn bạn có thể thực hành với các bài tập sau đây.

  1. Viết chương trình hiện thị giống như mảng số sau đây(dùng Dictionary hoặc Array):
1 2 3 4 5
6 7 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
  1. Viết chương trình nhập vào ma trận 4×4 và tính tổng các đường chéo và in nó ra(dùng Dictionary hoặc Array).
  2. Viết một chương trình thêm, sửa, xoá và tìm kiếm dữ liệu của một đối tượng theo tên, địa chỉ, số điện thoại(dùng Dictionary hoặc Array)

Qua bài này chúng ta đã biết thêm được nhiều cách làm việc với kiểu tập trong swift. Ngoài ra, chúng ta còn biết khi nào thì chọn và sử dụng array, dictionary, set, tuples để áp dụng nó vào project của mình một cách tốt và tối ưu nhất.

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!