Guard trong Swift là gì?
Ở bài trước, ta đã tìm hiểu về kiểu Optional trong Swift. Ngoài sử dụng if let cho Optional Binding, ta cũng có thể dùng guard.
Syntax đầy đủ khi dùng guard:
guard else {
return
}
Câu 'thần chú' của mình để cho dễ hiểu là:
đảm bảo rằng nếu không thì {
return
}
Ví dụ nếu không dùng guard
Mình có 2 UITextField như sau:
@IBOutlet weak var usernameTF: UITextField!
@IBOutlet weak var passwordTF: UITextField!
Khi lấy giá trị của UITextfield bằng cách usernameTF.text thì sẽ trả về kiểu Optional: 
Chúng ta cần kiểu tra xem user có nhập đúng kiểu dữ liệu của username và password không, nếu dùng if let thì phải làm như sau:
|
if let username = usernameTF.text { |
|
if let password = passwordTF.text { |
|
// Do register user here |
|
}else { |
|
// Alert no password |
|
} |
|
}else { |
|
// Alert no username |
|
} |
Bạn sẽ thấy vấn đề là các câu if bị lồng vào nhau rất khó nhìn. Nếu cần phải check khoảng 4 cái control từ user thì càng khó nhìn hơn nữa. Việc validation sẽ dễ dàng hơn với guard như sau.
Ví dụ dùng guard
|
guard let username = usernameTF.text, username.characters.count >= 6 else { |
|
// wrong username format |
|
return |
|
} |
|
guard let password = passwordTF.text, password.characters.count >= 6 else { |
|
// wrong password format |
|
return |
|
} |
|
// do register user here |
Bạn sẽ thấy code nhìn dễ nhìn hơn nhiều và đúng với code style early return hơn.
Ngoài ra, bạn có thể tách riêng phần validation code để tiện cho việc unit testing và xử lý logic hơn. Ví dụ bạn cần check username xem có trùng hay không và username phải có trên 6 ký tự và username phải có ít nhất một số.
|
func login() { |
|
guard let username = usernameTF.text, isValid(username: username) else { |
|
// wrong username format |
|
return |
|
} |
|
// do register here |
|
} |
|
|
|
func isValid(username: String) -> Bool { |
|
// check username trùng |
|
// check username phải có trên 6 ký tự |
|
// check username phải có ít nhất một số. |
|
return true |
|
} |
Dưới đây là một ví dụ thực tế mình dùng guard để validate các điều kiện, nếu mà dùng if sẽ cực kỳ rối mắt.
|
guard DataService.ds.introImage != nil else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noIntroImage) |
|
return |
|
} |
|
guard DataService.ds.photoImage != nil else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noPhotoImage) |
|
return |
|
} |
|
guard DataService.ds.videoImage != nil else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noVideoImage) |
|
return |
|
} |
|
|
|
guard let startToBoothText = startToBoothTF.text, startToBoothText != "" else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noIntroText) |
|
return |
|
} |
|
guard let photoText = photoTF.text, photoText != "" else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noPhotoText) |
|
return |
|
|
|
} |
|
|
|
guard let videoText = videoTF.text, videoText != "" else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noVideoText) |
|
return |
|
} |
|
|
|
guard let emailSubject = emailSubjectTF.text, emailSubject != "" else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noEmailSubject) |
|
return |
|
} |
|
|
|
print(emailBodyTV.text) |
|
guard emailBodyTV.text != Settings.PlaceHolder.emailBody else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noEmailBody) |
|
return |
|
} |
|
|
|
guard emailBodyTV.text != "" else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noEmailBody) |
|
return |
|
} |
|
|
|
|
|
guard let countDownTimer = countDownTimerTF.text, countDownTimer != "" else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noCountDownTimer) |
|
return |
|
} |
|
// |
|
guard let delayTime = delayTF.text, delayTime != "" else { |
|
showAlert(title: Settings.General.appName, message: Settings.Error.noDelayTimer) |
|
return |
|
} |
Kết
Mặc dù ý tưởng dùng guard không có gì mới, nhưng việc thêm từ khóa này trong Swift cũng một phần làm ngôn ngữ này trở nên gần gũi với người lập trình hơn. Khi dùng guard bạn hãy nhớ câu: "Đảm bảo rằng ..... nếu không thì ..... ". Đây là một trong những lý do mình thích Swift vì viết code như viết tiếng Anh.
Bài viết là tài liệu đọc thêm cho khóa học iOS với Swift, bạn có thể đọc thêm nếu quan tâm.
Bài viết liên quan
[Case Study] - StatcWeb.Studio dùng nocode để làm tool nocode: 200h - 0 sales - 5 min(s) read - published on January 24, 2021[Case Study] Bán No-code MVP làm trong 100h giá $5000 - 11 min(s) read - published on January 15, 2021Chi tiết mình validate idea với nocode - 3 tuần 60 sales - $567 - 7 min(s) read - published on December 15, 2020Do things that don't scale - Lời khuyên tốt nhất để validate idea làm app - 2 min(s) read - published on November 22, 2020GPT-3 sẽ là phát minh quan trọng kể từ Blockchain - 4 min(s) read - published on September 15, 2020#6 - NoCode MVP - Tổng kết - 5 min(s) read - published on August 22, 2020#5 - NoCode MVP - Buông bỏ để hạnh phúc - 2 min(s) read - published on July 28, 2020#4 - NoCode MVP - Ý tưởng. Một lần chơi lớn - 4 min(s) read - published on July 2, 2020#3 - NoCode MVP - Sức mạnh của Bubble.io - 5 min(s) read - published on June 29, 2020#2 - NoCode MVP - Tại sao là NoCode và tương lai của nó - 7 min(s) read - published on June 28, 2020