Struct vs Class
1. Giới thiệu
Phần tiêu đề “1. Giới thiệu”Struct là value type, Class là reference type. Chọn đúng loại quan trọng cho performance và behavior.
2. Value Type vs Reference Type
Phần tiêu đề “2. Value Type vs Reference Type”// Struct - Value Typestruct PointS { var x: Int var y: Int}
var p1 = PointS(x: 10, y: 20)var p2 = p1 // Copyp2.x = 100print(p1.x) // 10 (unchanged)
// Class - Reference Typeclass PointC { var x: Int var y: Int init(x: Int, y: Int) { self.x = x; self.y = y }}
let c1 = PointC(x: 10, y: 20)let c2 = c1 // Same referencec2.x = 100print(c1.x) // 100 (changed!)3. Mutation
Phần tiêu đề “3. Mutation”// Struct với let - immutable hoàn toànlet structPoint = PointS(x: 10, y: 20)// structPoint.x = 100 // Error!
// Class với let - có thể thay đổi propertieslet classPoint = PointC(x: 10, y: 20)classPoint.x = 100 // OK!4. Inheritance
Phần tiêu đề “4. Inheritance”// Struct KHÔNG hỗ trợ inheritancestruct Animal {}// struct Dog: Animal {} // Error!
// Class hỗ trợ inheritanceclass AnimalC {}class DogC: AnimalC {}5. Initializers
Phần tiêu đề “5. Initializers”// Struct - memberwise initializer tự độngstruct Person { var name: String var age: Int}let p = Person(name: "Alice", age: 25)
// Class - phải viết initializerclass PersonC { var name: String var age: Int init(name: String, age: Int) { self.name = name self.age = age }}6. Deinitializers
Phần tiêu đề “6. Deinitializers”// Struct KHÔNG có deinit
// Class có deinitclass Resource { deinit { print("Cleaning up...") }}7. Khi nào dùng Struct
Phần tiêu đề “7. Khi nào dùng Struct”// ✅ Dùng Struct khi:// - Encapsulate simple data// - Copy semantics phù hợp// - Không cần kế thừa// - Thread-safe by default
struct Coordinate { var latitude: Double var longitude: Double}
struct Money { var amount: Decimal var currency: String}8. Khi nào dùng Class
Phần tiêu đề “8. Khi nào dùng Class”// ✅ Dùng Class khi:// - Cần kế thừa// - Cần deinit// - Cần shared mutable state// - Identity quan trọng hơn equality
class ViewController { // Shared instance, identity matters}
class NetworkSession { // Cần deinit để cleanup connections deinit { disconnect() }}9. Performance
Phần tiêu đề “9. Performance”// Struct - thường nhanh hơn// - Stack allocation (nhỏ)// - Copy-on-write optimization
// Class - overhead nhiều hơn// - Heap allocation// - Reference counting// - Potential memory leaks10. Bảng so sánh
Phần tiêu đề “10. Bảng so sánh”| Feature | Struct | Class |
|---|---|---|
| Type | Value | Reference |
| Inheritance | ❌ | ✅ |
| Deinit | ❌ | ✅ |
| Memberwise init | ✅ Auto | ❌ Manual |
| Mutating keyword | ✅ Cần | ❌ Không cần |
| Identity (===) | ❌ | ✅ |
| Thread-safe | ✅ By default | ❌ Cần xử lý |
📝 Tóm tắt
Phần tiêu đề “📝 Tóm tắt”- Struct: Value type, copy, no inheritance
- Class: Reference type, shared, inheritance
- Ưu tiên Struct cho data models
- Dùng Class khi cần inheritance/identity
- Struct thread-safe hơn
- Apple khuyến nghị: Struct by default