Đọc bài viết này tôi nhận thấy những lợi ích tuyệt vời khi sử dụng Guard
Ở đây bạn có thể so sánh việc sử dụng bảo vệ với một ví dụ:
Đây là phần không có người bảo vệ:
func fooBinding(x: Int?) {
if let x = x where x > 0 {
// Do stuff with x
x.description
}
// Value requirements not met, do something
}
Ở đây bạn đang đặt mã mong muốn của mình trong tất cả các điều kiện
Bạn có thể không thấy ngay vấn đề này, nhưng bạn có thể tưởng tượng nó sẽ trở nên khó hiểu như thế nào nếu nó được lồng với nhiều điều kiện cần phải đáp ứng trước khi chạy các câu lệnh của bạn
Cách để làm sạch điều này là thực hiện từng kiểm tra trước và thoát nếu có bất kỳ kiểm tra nào. Điều này cho phép dễ dàng hiểu những điều kiện sẽ làm cho chức năng này thoát ra.
Nhưng bây giờ chúng ta có thể sử dụng bảo vệ và chúng ta có thể thấy rằng có thể giải quyết một số vấn đề:
func fooGuard(x: Int?) {
guard let x = x where x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
x.description
}
- Kiểm tra điều kiện bạn muốn, không phải điều kiện bạn không muốn. Điều này một lần nữa tương tự như một khẳng định. Nếu điều kiện không được đáp ứng, câu lệnh khác của người bảo vệ được chạy, nó sẽ thoát ra khỏi chức năng.
- Nếu điều kiện vượt qua, biến tùy chọn ở đây sẽ tự động được mở ra cho bạn trong phạm vi mà câu lệnh bảo vệ được gọi - trong trường hợp này là hàm fooGuard (_ :).
- Bạn đang sớm kiểm tra các trường hợp xấu, giúp chức năng của bạn dễ đọc hơn và dễ bảo trì hơn
Mẫu tương tự này cũng đúng với các giá trị không tùy chọn:
func fooNonOptionalGood(x: Int) {
guard x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
}
func fooNonOptionalBad(x: Int) {
if x <= 0 {
// Value requirements not met, do something
return
}
// Do stuff with x
}
Nếu bạn vẫn có bất kỳ câu hỏi nào, bạn có thể đọc toàn bộ bài viết: Tuyên bố bảo vệ Swift.
Kết thúc
Và cuối cùng, đọc và kiểm tra tôi thấy rằng nếu bạn sử dụng bảo vệ để mở khóa bất kỳ tùy chọn nào,
những giá trị chưa được bao bọc đó sẽ giúp bạn sử dụng trong phần còn lại của khối mã
.
guard let unwrappedName = userName else {
return
}
print("Your username is \(unwrappedName)")
Ở đây, giá trị chưa được mở sẽ chỉ khả dụng trong khối if
if let unwrappedName = userName {
print("Your username is \(unwrappedName)")
} else {
return
}
// this won't work – unwrappedName doesn't exist here!
print("Your username is \(unwrappedName)")