guard trong Swift

February 1, 2018
Categories:
Tags:

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: Guard trong Swift

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.

browser
Author: Khoa Nguyen
https://niviki.com
Thất nghiệp. Đang rủ rê nhiều người thất nghiệp. Nhận tư vấn Zero to MVP để nhiều người bỏ việc. Hy vọng với NIVIKI.COM có thể lan toả tinh thần thất nghiệp đến với nhiều người hơn nữa.