Struct là gì?
Struct trong Swift là một kiểu dữ liệu giá trị (value type) được sử dụng để định nghĩa một loại dữ liệu mới. Nó cho phép bạn nhóm các thuộc tính (properties) và phương thức (methods) lại với nhau để tạo ra một thực thể có ý nghĩa. Struct thường được sử dụng để mô tả các đối tượng không phức tạp, không cần kế thừa và không có các tính năng phức tạp như lớp (class).
Tại sao sử dụng Struct?
- Tạo các kiểu dữ liệu tùy chỉnh: Bạn có thể tạo các kiểu dữ liệu phù hợp với nhu cầu của mình, giúp code trở nên rõ ràng và dễ bảo trì hơn.
- Truyền dữ liệu: Struct được truyền bằng giá trị, nghĩa là khi bạn truyền một struct cho một hàm, một bản sao mới của struct sẽ được tạo ra. Điều này giúp tránh được các vấn đề liên quan đến việc thay đổi dữ liệu không mong muốn.
- Tạo các cấu trúc dữ liệu đơn giản: Struct rất phù hợp để tạo các cấu trúc dữ liệu đơn giản như điểm (Point), hình chữ nhật (Rectangle), v.v.
- Khai Báo Struct
Bạn khai báo một Struct bằng từ khóa
struct
, sau đó định nghĩa các thuộc tính và phương thức bên trong.
struct Person {
var name: String
var age: Int
}
Trong ví dụ trên, chúng ta đã tạo một struct có tên là Person
với các thuộc tính name, author
và age
- Khởi Tạo Struct ** 2.1. Trình khởi tạo mặc định** Swift tự động cung cấp một trình khởi tạo (initializer) mặc định cho Struct khi bạn khai báo các thuộc tính.
struct Person {
var name: String
var age: Int
}
let person = Person(name: "John", age: 30)
print(person) // Kết quả: Person(name: "John", age: 30)
2.2. Tạo trình khởi tạo tùy chỉnh Bạn có thể tạo một trình khởi tạo riêng để kiểm soát cách Struct được khởi tạo.
struct Person {
var name: String
var age: Int
init(name: String) {
self.name = name
self.age = 0 // Giá trị mặc định
}
}
let person = Person(name: "Alice")
print(person.age) // Kết quả: 0
- Thuộc Tính (Properties) Trong Struct 3.1. Thuộc tính lưu trữ (Stored Properties) Thuộc tính lưu trữ là những giá trị được lưu trực tiếp trong bộ nhớ của Struct.
struct Rectangle {
var width: Double
var height: Double
}
let rect = Rectangle(width: 10.0, height: 5.0)
print(rect.width) // Kết quả: 10.0
3.2. Thuộc tính tính toán (Computed Properties) Thuộc tính tính toán không lưu trữ giá trị mà cung cấp logic để tính toán giá trị mỗi khi được truy cập.
struct Rectangle {
var width: Double
var height: Double
var area: Double {
return width * height
}
}
let rect = Rectangle(width: 10.0, height: 5.0)
print(rect.area) // Kết quả: 50.0
3.3. Thay đổi thuộc tính
let rect = Rectangle(width: 10.0, height: 5.0)
rect.width = 20.0
print(rect.width) // Kết quả: 20.0
- Phương Thức (Methods) Trong Struct Struct có thể chứa các phương thức (methods) để thực hiện các hành động liên quan đến dữ liệu bên trong nó. 4.1. Phương thức thông thường Phương thức trong Struct có thể đọc và xử lý dữ liệu.
struct Person {
var name: String
var age: Int
func greet() {
print("Hello, my name is \(name) and I am \(age) years old.")
}
}
let person = Person(name: "Alice", age: 25)
person.greet() // Kết quả: "Hello, my name is Alice and I am 25 years old."
4.2. Phương thức thay đổi (Mutating Methods)
Nếu một phương thức muốn thay đổi thuộc tính trong Struct, bạn cần sử dụng từ khóa mutating
.
struct Counter {
var count: Int = 0
mutating func increment() {
count += 1
}
}
var counter = Counter()
counter.increment()
print(counter.count) // Kết quả: 1
- Sự Khác Biệt Giữa Struct và Class ** 5.1. Struct là kiểu giá trị (Value Type) ** Struct được truyền theo giá trị . Khi bạn gán Struct cho một biến mới, một bản sao sẽ được tạo.
struct Person {
var name: String
}
var person1 = Person(name: "John")
var person2 = person1
person2.name = "Alice"
print(person1.name) // Kết quả: "John"
print(person2.name) // Kết quả: "Alice"
5.2. Class là kiểu tham chiếu (Reference Type) Khác với Struct, Class được truyền theo tham chiếu , nghĩa là cả hai biến sẽ trỏ đến cùng một vùng nhớ.
-
Tính Kế Thừa Struct không hỗ trợ kế thừa như Class. Nếu bạn cần sử dụng tính kế thừa, hãy chọn Class thay vì Struct.
-
Sử Dụng Struct Trong Thực Tế Struct thường được sử dụng để:
- Đại diện cho các đối tượng hoặc mô hình dữ liệu (như tọa độ, kích thước, màu sắc).
- Quản lý dữ liệu đơn giản trong ứng dụng.
- Tạo các kiểu dữ liệu nhẹ và hiệu quả.
Ví dụ: Tọa độ 2D
struct Point {
var x: Double
var y: Double
}
let point = Point(x: 5.0, y: 10.0)
print("Point is at (\(point.x), \(point.y))")
- Khi Nào Nên Dùng Struct? Hãy sử dụng Struct nếu:
- Bạn chỉ cần một kiểu dữ liệu nhẹ và đơn giản.
- Khi bạn không cần các tính năng phức tạp của lớp như kế thừa, đa hình.
- Dữ liệu không thay đổi hoặc không cần chia sẻ giữa các đối tượng khác.
Kết Luận
Struct là một công cụ mạnh mẽ và linh hoạt trong Swift, đặc biệt phù hợp với các trường hợp làm việc với kiểu dữ liệu nhẹ và không cần kế thừa. Việc hiểu và sử dụng Struct đúng cách sẽ giúp bạn viết mã rõ ràng, dễ bảo trì và hiệu quả hơn!