我正在重構一些代碼,我正在考慮如何重構并減少代碼。
代碼是:
func textFieldDidEndEditing(_ textField: UITextField) {
guard !firstTextField.text!.isEmpty else {
firstTextField.showErrorMessage(message: "Please fill the field.")
confirmButton.disable(.filled)
return
}
guard !firstTextField.text!.isEmpty && firstTextField.text!.contains(words[firstWord-1]) else {
firstTextField.showErrorMessage(message: "Wrong word. Please check again.")
confirmButton.disable(.filled)
return
}
firstTextField.hideErrorMessage()
firstTextField.setCorrectLayout()
guard !secondTextField.text!.isEmpty else {
secondTextField.showErrorMessage(message: "Please fill the field.")
confirmButton.disable(.filled)
return
}
guard !secondTextField.text!.isEmpty && secondTextField.text!.contains(words[secondWord-1]) else {
secondTextField.showErrorMessage(message: "Wrong word. Please check again.")
confirmButton.disable(.filled)
return
}
secondTextField.hideErrorMessage()
secondTextField.setCorrectLayout()
guard !thirdTextField.text!.isEmpty else {
thirdTextField.showErrorMessage(message: "Please fill the field.")
confirmButton.disable(.filled)
return
}
guard !thirdTextField.text!.isEmpty && thirdTextField.text!.contains(words[thirdWord-1]) else {
thirdTextField.showErrorMessage(message: "Wrong word. Please check again.")
confirmButton.disable(.filled)
return
}
thirdTextField.hideErrorMessage()
thirdTextField.setCorrectLayout()
guard !fourthTextField.text!.isEmpty else {
fourthTextField.showErrorMessage(message: "Please fill the field.")
confirmButton.disable(.filled)
return
}
guard !fourthTextField.text!.isEmpty && fourthTextField.text!.contains(words[fourthWord-1]) else {
fourthTextField.showErrorMessage(message: "Wrong word. Please check again.")
confirmButton.disable(.filled)
return
}
fourthTextField.hideErrorMessage()
fourthTextField.setCorrectLayout()
confirmButton.enable(.filled)
}
所以訊息是一樣的,只是一些引數發生了變化,比如textfield和intin words[]。
我想使用一個函式并將引數放入其中,然后多次呼叫它,但不幸的是guard statement只會回傳該函式,甚至不回傳textFieldDidEndEnditing()
有沒有更好的方法用更少的代碼來驗證它(以相同的方式作業)?
uj5u.com熱心網友回復:
首先,我會創建一個這樣的擴展(請注意,我還洗掉了強制解包以避免崩潰):
extension UITextField {
func isValid(with word: String) -> Bool {
guard let text = self.text,
!text.isEmpty else {
showErrorMessage(message: "Please fill the field.")
return false
}
guard text.contains(word) else {
showErrorMessage(message: "Wrong word. Please check again.")
return false
}
hideErrorMessage()
setCorrectLayout()
}
}
然后以最簡單的方式,您可以像這樣使用它:
func textFieldDidEndEditing(_ textField: UITextField) {
guard firstTextField.isValid(with: words[firstWord-1]),
secondTextField.isValid(with: words[secondWord-1]),
... else {
confirmButton.disable(.filled)
return
}
confirmButton.enable(.filled)
}
這是基礎知識。您可以通過制作文本欄位字典(作為鍵)來進一步改進它,并將Int正確單詞的位置定義為值:
let linkedFields: [UITextField: Int] = [
firstTextField: firstWord,
secondTextField: secondWord,
...
]
所以現在你可以像這樣回圈:
func textFieldDidEndEditing(_ textField: UITextField) {
for linkedField in linkedFields {
guard linkedField.key.isValid(with: words[linkedField.vallue]) else {
confirmButton.disable(.filled)
return
}
}
confirmButton.enable(.filled)
}
正如您可能注意到的那樣,我沒有使用您知道此處剛剛編輯了哪個欄位的事實,就像您的邏輯一樣。如果您想顯示所有未一次性填寫的欄位的錯誤,那可能沒問題。但是,如果您只想顯示用戶“觸摸”的欄位的錯誤(而不是用戶尚未訪問的欄位),則需要保留更多資訊,并且僅檢查此函式中已編輯的欄位。不過,我會忽略這方面,因為這不是您問題的一部分。
uj5u.com熱心網友回復:
您不需要在委托方法中提供特定的 textField 名稱。你可以用
func textFieldDidEndEditing(_ textField: UITextField) {
guard !textField.text!.isEmpty else {
textField.showErrorMessage(message: "Please fill the field.")
confirmButton.disable(.filled)
return
}
guard !textField.text!.isEmpty && textField.text!.contains(words[textfield.tag-1]) else {
textField.showErrorMessage(message: "Wrong word. Please check again.")
confirmButton.disable(.filled)
return
}
textField.hideErrorMessage()
textField.setCorrectLayout()
}
我不知道什么是文字array和firstWord,secondWord..問題,但即使我知道。,你的第二個guard不會在任何時候執行。如果第二個守衛條件為假,則意味著第一個也是假的,這意味著它將在不控制其他人的情況下執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360702.html
