0

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: structclass. 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 ab 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ả structclass đề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

➡️ ab 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

➡️ ab đề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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí