- vừa được xem lúc

Cách mình sử dụng struct và class trong Swift hiệu quả!!!

0 0 5

Người đăng: tran anh

Theo Viblo Asia

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é!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cách Swift quản lý bộ nhớ với cơ chế ARC - Automatic Reference Counting

Tổng quan về bộ nhớ Stack và Heap. Chắc hẳn bất cứ ai trong chúng ta đều đã từng nghe đến khái niệm về 2 loại bộ nhớ Stack và Heap khi tìm hiểu về cách các ngôn ngữ lập trình quản lý và phân phối bộ nhớ của máy tính.

0 0 161

- vừa được xem lúc

Cách wrap UserDefault sử dụng Property Wrapper

Tổng quan. Trong các ứng dụng thực tế, bạn thường sẽ phải lưu một số thông tin người dùng như họ tên, email, số điện thoại hay một số thông tin tài khoản khác sau khi đăng nhập để có thể sử dụng ở nhiều nơi trong App mà không cần thực hiện lời gọi API.

0 0 45

- vừa được xem lúc

Custom UIPageViewController

Đặt vấn đề. Trong quá trình xây dựng ứng dụng, chắc hẳn chúng ta sẽ gặp UI/UX như thế này. . Để giải quyết bài toán này, đa phần mọi người sẽ chọn cách đưa một CollectionView vào trong một CollectionView.

0 0 24