Cách mình sử dụng struct và class trong Swift hiệu quả!!!
Swift cung cấp hai công cụ cực kỳ mạnh mẽ để xây dựng kiểu dữ liệu tùy chỉnh: struct
và class
. Cả hai đều hữu ích, nhưng việc chọn sai có thể khiến code khó bảo trì hoặc dễ gây lỗi.
Vậy nên dùng cái nào? Hãy cùng tìm hiểu chi tiết, với ví dụ minh họa và tình huống sử dụng thực tế!
1. Định nghĩa
struct
Là kiểu dữ liệu value type, tức là khi gán hoặc truyền đi, một bản sao độc lập được tạo ra. Điều này giúp đảm bảo tính an toàn của dữ liệu vì các đối tượng không ảnh hưởng lẫn nhau.
struct User {
var name: String
var age: Int
}
Ví dụ, nếu bạn truyền User
từ A sang B, mọi thay đổi trong B sẽ không ảnh hưởng đến dữ liệu gốc trong A. Điều này cực kỳ hữu ích trong xử lý dữ liệu UI, dữ liệu API, hoặc logic thuần.
class
Là kiểu dữ liệu reference type, tức là khi gán hoặc truyền, các biến sẽ cùng tham chiếu đến cùng một vùng nhớ.
class User {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
Ví dụ, nếu hai biến a
và b
cùng tham chiếu đến một đối tượng User
, thì bất kỳ thay đổi nào từ a
cũng sẽ thấy ở b
. Điều này rất phù hợp trong những trường hợp cần chia sẻ trạng thái (shared state) như: quản lý session người dùng, view model trong UIKit, hoặc quản lý các đối tượng trong game.
2. Điểm giống nhau
Cả struct
và class
đều là kiểu dữ liệu tùy chỉnh, có thể:
- Khai báo thuộc tính (
property
) và phương thức (method
) - Sử dụng
init
để khởi tạo - Conform các
protocol
- Mở rộng bằng
extension
Nhờ sự linh hoạt này, cả hai đều đủ mạnh để dùng cho cả dự án nhỏ lẫn lớn.
3. So sánh struct
vs class
Đặc điểm | struct (Value type) |
class (Reference type) |
---|---|---|
Truyền dữ liệu | Sao chép giá trị (copy) | Truyền tham chiếu (reference) |
Kế thừa | ❌ Không hỗ trợ | ✅ Có |
ARC | ❌ Không cần | ✅ Có |
deinit |
❌ Không có | ✅ Có |
Mutating method | ✅ Phải dùng mutating |
❌ Không cần |
4. Ví dụ minh họa
struct
là value type:
struct Product {
var name: String
var quantity: Int
}
var a = Product(name: "Sữa", quantity: 10)
var b = a
b.quantity = 5
print(a.quantity) // 10
print(b.quantity) // 5
➡️ a
và b
là hai đối tượng tách biệt. Đây là hành vi mong muốn khi bạn muốn đảm bảo dữ liệu gốc không bị thay đổi ngoài ý muốn.
class
là reference type:
class Product {
var name: String
var quantity: Int
init(name: String, quantity: Int) {
self.name = name
self.quantity = quantity
}
}
var a = Product(name: "Sữa", quantity: 10)
var b = a
b.quantity = 5
print(a.quantity) // 5
print(b.quantity) // 5
➡️ a
và b
đều tham chiếu cùng một đối tượng, nên thay đổi ở b
ảnh hưởng đến a
.
5. Khi nào nên dùng struct
?
Swift khuyến khích sử dụng struct
trong phần lớn các tình huống, đặc biệt là:
- Dữ liệu không cần kế thừa
- Trạng thái không thay đổi (immutable hoặc copy-on-write)
- Model dữ liệu API, ví dụ:
User
,Task
,Order
- View trong SwiftUI (mọi
View
đều làstruct
) - Dữ liệu được chia sẻ tạm thời hoặc một chiều
Ví dụ thực tế:
struct Article {
let id: Int
let title: String
let content: String
}
Article
ở đây chỉ là một khối dữ liệu – không cần kế thừa, không chia sẻ logic – dùng struct
là tối ưu.
6. Khi nào nên dùng class
?
Hãy dùng class
khi:
- Cần kế thừa từ class cha (ví dụ:
UIViewController
) - Cần quản lý tài nguyên với
deinit
- Dữ liệu cần được chia sẻ giữa nhiều nơi
- Tương tác với các framework dùng Objective-C (UIKit, AppKit)
Ví dụ thực tế:
class SessionManager {
static let shared = SessionManager()
var token: String?
}
SessionManager
là singleton chia sẻ dữ liệu toàn cục – nếu dùng struct
, dữ liệu sẽ không đồng bộ giữa các nơi.
7. Tổng kết: Chọn gì?
Bạn cần... | Nên chọn |
---|---|
Hiệu năng tốt, dữ liệu đơn giản | struct |
Kế thừa hoặc chia sẻ trạng thái | class |
Mô hình dữ liệu (model) | struct |
Tương tác với UIKit | class |
Kết luận
Việc chọn đúng struct
hay class
không chỉ giúp code của bạn gọn gàng hơn mà còn giúp tránh được những bug khó chịu do quản lý bộ nhớ và trạng thái.
Hãy dùng struct
theo mặc định, và chỉ dùng class
khi thật sự cần thiết. Đây là triết lý hiện đại mà Swift (và cộng đồng iOS) đang hướng đến.
📌 Cảm ơn bạn đã đọc! Nếu bạn thấy bài viết hữu ích, đừng quên chia sẻ hoặc follow để nhận thêm nhiều bài viết Swift thú vị khác nhé!
All rights reserved