Mảng (Array) là một cấu trúc dữ liệu quan trọng trong Swift, cho phép lưu trữ nhiều giá trị trong một biến duy nhất. Mỗi giá trị trong mảng được gọi là phần tử và có thể được truy xuất thông qua chỉ mục (index) của nó. Việc hiểu và sử dụng thành thạo mảng sẽ giúp lập trình viên quản lý và xử lý dữ liệu hiệu quả hơn khi phát triển ứng dụng iOS và macOS.
1. Khởi Tạo Mảng
Trong Swift, có nhiều cách để khởi tạo một mảng:
- Khởi tạo mảng rỗng :
var emptyArray: [Int] = [] // Mảng rỗng kiểu Int
var stringArray = [String]() // Mảng rỗng kiểu String
- Khởi tạo mảng với các phần tử ban đầu :
let fruits = ["Táo", "Cam", "Chuối"] // Mảng kiểu String với 3 phần tử
let numbers: [Int] = [1, 2, 3, 4, 5] // Mảng kiểu Int với các phần tử cụ thể
Swift tự động suy ra kiểu dữ liệu của mảng từ các phần tử đã được khởi tạo. Tuy nhiên, nếu muốn, bạn vẫn có thể chỉ định kiểu dữ liệu rõ ràng.
2. Thao Tác Cơ Bản Trên Mảng
- Truy cập phần tử qua chỉ mục : Mỗi phần tử trong mảng đều có chỉ mục, bắt đầu từ 0.
let fruits = ["Táo", "Cam", "Chuối"]
print(fruits[0]) // Kết quả: "Táo"
let firstItem = fruits[0] // Truy cập phần tử đầu tiên
let lastItem = fruits[fruits.count - 1] // Truy cập phần tử cuối cùng
- Thêm phần tử vào mảng : Sử dụng
append()
để thêm phần tử mới vào cuối mảng.
var numbers = [1, 2, 3]
numbers.append(4) // Thêm phần tử vào cuối mảng. Mảng trở thành [1, 2, 3, 4]
numbers.insert(0, at: 0) // Thêm phần tử vào đầu mảng
- Thay đổi giá trị của phần tử
numbers[2] = 10 // Thay đổi giá trị phần tử thứ 3
- Xóa phần tử
Dùng
remove(at:)
để xóa phần tử theo chỉ mục hoặcremoveLast()
để xóa phần tử cuối cùng.
numbers.remove(at: 2) // Xóa phần tử ở chỉ mục 2
numbers.removeLast() // Xóa phần tử cuối cùng
- Chèn phần tử tại vị trí cụ thể : Sử dụng
insert(_:at:)
.
numbers.insert(5, at: 1) // Mảng trở thành [1, 5, 2, 3, 4]
- Kiểm tra độ dài của mảng : Sử dụng thuộc tính
count
.
print(numbers.count) // In ra số lượng phần tử trong mảng
3. Duyệt Mảng
Swift cung cấp các phương thức tiện lợi để duyệt qua các phần tử trong mảng:
- Duyệt qua vòng lặp for :
let fruits = ["Táo", "Cam", "Chuối"]
for fruit in fruits {
print(fruit)
}
- Duyệt qua chỉ mục và phần tử :
for (index, fruit) in fruits.enumerated() {
print("Phần tử ở chỉ mục \(index) là \(fruit)")
}
4. Một Số Phương Thức Hữu Ích Khác Của Mảng
-
count: Trả về số lượng phần tử trong mảng.
-
isEmpty: Kiểm tra xem mảng có rỗng hay không.
-
contains: Kiểm tra xem mảng có chứa một giá trị cụ thể hay không.
-
sorted: Sắp xếp mảng theo thứ tự tăng dần hoặc giảm dần.
-
map: Áp dụng một hàm lên từng phần tử của mảng và trả về một mảng mới.
-
filter: Lọc các phần tử trong mảng dựa trên một điều kiện.
-
reduce: Kết hợp tất cả các phần tử của mảng thành một giá trị duy nhất.
-
Kiểm tra mảng rỗng :
if fruits.isEmpty {
print("Mảng rỗng")
} else {
print("Mảng có phần tử")
}
- Ghép mảng : Sử dụng
+
để ghép hai mảng lại với nhau.
let moreFruits = ["Dưa hấu", "Nho"]
let allFruits = fruits + moreFruits
- Tìm kiếm phần tử :
- Kiểm tra phần tử có tồn tại trong mảng :
if fruits.contains("Táo") {
print("Mảng có chứa Táo")
}
- Tìm vị trí phần tử đầu tiên thỏa mãn điều kiện :
let index = fruits.firstIndex(of: "Cam") // Trả về chỉ mục của "Cam"
- Sắp xếp :
let numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
// Sắp xếp tăng dần
let sortedNumbers = numbers.sorted()
// Sắp xếp giảm dần
let sortedNumbersDescending = numbers.sorted(by: >)
struct Person {
let name: String
let age: Int
}
let people = [
Person(name: "Alice", age: 30),
Person(name: "Bob", age: 25),
Person(name: "Charlie", age: 35)
]
// Sắp xếp theo tuổi tăng dần
let sortedPeople = people.sorted(by: { $0.age < $1.age })
5. Mảng Không Thay Đổi (Immutable) và Mảng Có Thể Thay Đổi (Mutable)
Trong Swift, nếu bạn khai báo một mảng bằng let
, mảng đó sẽ không thể thay đổi (immutable), nghĩa là không thể thêm, xóa, hoặc thay đổi các phần tử sau khi đã khởi tạo. Nếu muốn thay đổi, bạn cần khai báo mảng bằng var
.
- Mảng không thay đổi :
let numbers = [1, 2, 3]
// Không thể thực hiện các thao tác thay đổi như append, insert, remove
- Mảng có thể thay đổi :
var numbers = [1, 2, 3]
numbers.append(4) // Mảng bây giờ là [1, 2, 3, 4]
6. Mảng đa Chiều
Swift cho phép bạn tạo mảng đa chiều (mảng lồng trong mảng), như mảng hai chiều, ba chiều...
- Ví dụ về mảng hai chiều :
let matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[1][2]) // Truy xuất phần tử thứ 2 của hàng thứ 1: 6
var matrix = [[Int]]()
matrix.append([1, 2, 3])
matrix.append([4, 5, 6])
7. Sao Chép Mảng
Khi làm việc với mảng trong Swift, cần chú ý rằng mảng trong Swift là kiểu giá trị (value type). Khi bạn sao chép một mảng, Swift sẽ tạo một bản sao độc lập của mảng đó.
var originalArray = [1, 2, 3]
var copiedArray = originalArray
copiedArray.append(4) // Thêm phần tử vào mảng sao chép
print(originalArray) // Kết quả: [1, 2, 3]
print(copiedArray) // Kết quả: [1, 2, 3, 4]
Trong ví dụ này, originalArray
không bị thay đổi khi bạn thay đổi copiedArray
, vì đây là hai mảng độc lập.
8. Mảng và Tuple
Bạn có thể tạo mảng chứa các tuple:
var students = [(name: String, age: Int)]()
students.append(("Alice", 20))
9. Lưu ý quan trọng
- Kiểu dữ liệu: Tất cả các phần tử trong một mảng phải có cùng kiểu dữ liệu.
- An toàn: Swift sẽ kiểm tra lỗi truy cập mảng vượt quá giới hạn.
- Hiệu suất: Sử dụng mảng một cách hợp lý để tránh lãng phí bộ nhớ và tăng tốc độ thực thi.
10. Kết Luận
Mảng là một phần quan trọng của Swift, cho phép bạn quản lý các bộ sưu tập dữ liệu một cách dễ dàng và hiệu quả. Hiểu cách sử dụng mảng sẽ giúp bạn làm việc với dữ liệu trong Swift nhanh chóng và linh hoạt. Qua bài viết này, bạn đã biết cách khởi tạo, thao tác, và sử dụng mảng nhiều chiều trong Swift. Để thành thạo hơn, hãy thực hành thường xuyên và khám phá thêm các phương thức nâng cao của mảng trong Swift!
11. Các keyword cần tìm hiểu thêm
- Mảng và struct: Sử dụng mảng để lưu trữ các struct.
- Mảng và lớp: Sử dụng mảng để lưu trữ các đối tượng.
- Mảng và generic: Tạo các hàm và cấu trúc dữ liệu làm việc với các loại mảng khác nhau.
12. Bài tập thực hành
- Tạo một mảng chứa tên các ngày trong tuần.
- Tính tổng các số trong một mảng.
- Tìm phần tử lớn nhất trong một mảng.
- Sắp xếp một mảng theo thứ tự giảm dần.
- Tạo một mảng 2 chiều để biểu diễn một bàn cờ.