---
title: Tập trung hằng số vào enum hoặc struct
impact: MEDIUM
impactDescription: Magic number, hardcoded string rải rác khắp nơi làm khó bảo trì và dễ gây lỗi khi cần thay đổi giá trị.
tags: swift, ios, constants, magic-numbers, maintainability, code-quality
---

## Tập trung hằng số vào enum hoặc struct

Không để magic number, string literal, hay URL hardcoded rải rác trong code. Tập trung vào `enum` (namespace không khởi tạo được) hoặc `struct` với `static let`. Dùng `#imageLiteral` và `Asset` enum (thường được SwiftGen tạo) cho resource.

**Incorrect (magic number/string rải rác):**

```swift
class PaymentViewController: UIViewController {
    func setupUI() {
        view.layer.cornerRadius = 12       // magic number
        submitButton.layer.cornerRadius = 8  // magic number khác
    }

    func validateCard(number: String) -> Bool {
        return number.count == 16           // số thẻ phải đúng 16 số?
    }

    func buildAPIRequest() -> URLRequest {
        var request = URLRequest(url: URL(string: "https://api.example.com/v2/payments")!)
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("Bearer sk_live_abc123", forHTTPHeaderField: "Authorization")
        request.timeoutInterval = 30
        return request
    }
}
```

**Correct (hằng số tập trung):**

```swift
// Constants.swift
enum Constants {
    enum UI {
        static let cardCornerRadius: CGFloat = 12
        static let buttonCornerRadius: CGFloat = 8
    }
    enum Payment {
        static let creditCardLength = 16
        static let requestTimeout: TimeInterval = 30
    }
    enum API {
        static let baseURL = "https://api.example.com/v2"
        static let contentTypeJSON = "application/json"
    }
}

// Sử dụng
class PaymentViewController: UIViewController {
    func setupUI() {
        view.layer.cornerRadius = Constants.UI.cardCornerRadius
        submitButton.layer.cornerRadius = Constants.UI.buttonCornerRadius
    }

    func validateCard(number: String) -> Bool {
        return number.count == Constants.Payment.creditCardLength
    }
}
```

**Tools:** SwiftLint (`magic_number`), SwiftGen (tự tạo constant cho assets/colors/strings)

