Guard Statement
1. Giới thiệu
Phần tiêu đề “1. Giới thiệu”guard là cách Swift kiểm tra điều kiện và thoát sớm nếu điều kiện không thỏa mãn.
2. Cú pháp cơ bản
Phần tiêu đề “2. Cú pháp cơ bản”func checkAge(_ age: Int) { guard age >= 0 else { print("Invalid age") return } print("Age is valid: \(age)")}3. Guard với Optional Unwrapping
Phần tiêu đề “3. Guard với Optional Unwrapping”func greet(_ name: String?) { guard let name = name else { print("No name provided") return } // name bây giờ là non-optional print("Hello, \(name)!")}
greet("Alice") // Hello, Alice!greet(nil) // No name provided4. Guard vs If-let
Phần tiêu đề “4. Guard vs If-let”// Với if-let - phải lồng codefunc processWithIf(value: Int?) { if let value = value { if value > 0 { print("Processing: \(value)") } }}
// Với guard - code flat hơnfunc processWithGuard(value: Int?) { guard let value = value else { return } guard value > 0 else { return } print("Processing: \(value)")}5. Nhiều điều kiện
Phần tiêu đề “5. Nhiều điều kiện”func validateUser(name: String?, age: Int?, email: String?) { guard let name = name, let age = age, let email = email else { print("Missing required fields") return }
guard !name.isEmpty, age >= 18, email.contains("@") else { print("Invalid data") return }
print("Valid user: \(name), \(age), \(email)")}6. Guard với where
Phần tiêu đề “6. Guard với where”func processNumber(_ input: String?) { guard let input = input, let number = Int(input), number > 0 else { print("Invalid input") return } print("Number: \(number)")}7. Guard trong loops
Phần tiêu đề “7. Guard trong loops”let data = ["1", "two", "3", "four", "5"]
for item in data { guard let number = Int(item) else { print("Skipping: \(item)") continue } print("Number: \(number)")}8. Guard với throw
Phần tiêu đề “8. Guard với throw”enum ValidationError: Error { case emptyName case invalidAge}
func validatePerson(name: String?, age: Int?) throws -> (String, Int) { guard let name = name, !name.isEmpty else { throw ValidationError.emptyName }
guard let age = age, age >= 0 else { throw ValidationError.invalidAge }
return (name, age)}9. Early Exit Pattern
Phần tiêu đề “9. Early Exit Pattern”func processPayment(amount: Double?, cardNumber: String?, cvv: String?) -> Bool { guard let amount = amount, amount > 0 else { print("Invalid amount") return false }
guard let cardNumber = cardNumber, cardNumber.count == 16 else { print("Invalid card number") return false }
guard let cvv = cvv, cvv.count == 3 else { print("Invalid CVV") return false }
print("Processing payment: \(amount)") return true}10. Best Practices
Phần tiêu đề “10. Best Practices”// ✅ Dùng guard cho early exitfunc good(value: Int?) { guard let value = value, value > 0 else { return } // Happy path code here}
// ❌ Không dùng guard khi cần else branch phức tạpfunc notIdeal(value: Int?) { guard let value = value else { // Nhiều logic ở đây -> dùng if-let return }}📝 Tóm tắt
Phần tiêu đề “📝 Tóm tắt”guardkiểm tra điều kiện và thoát sớm- Phải có
return,throw,continue, hoặcbreak - Unwrap optionals với scope ngoài guard
- Giữ code flat, tránh lồng sâu
- Tốt cho early validation pattern