在 Swift 中满足条件时保存 TextField 输入的最佳方法



我有 2 个文本字段,其中包含表示 URL 的字符串。如果文本字段为空,则保存自定义字符串("无链接A"(,如果填充,则需要有效,否则显示警报。

有没有比使用这么多"if语句"更干净的方法来做到这一点?

linkA = linkATextField.text      
linkB = linkBTextField.text
@IBAction func doneButton(_ sender: Any) {
if linkA.isEmpty && linkB.isEmpty {
linkA = "no link A"
linkB = "no link B"
saveData()
} else {
if linkA.isEmpty == false && linkB.isEmpty == false  {
if linkA.isValidURL && linkB.isValidURL {
saveData()
} else {
showErrorAlert()
}
}
if linkA.isEmpty && linkB.isEmpty == false {
linkA = "no link A"
if linkB.isValidURL {
saveData()
} else {
showErrorAlert()
}
}
if linkA.isEmpty == false && linkB.isEmpty {
linkB = "no link B"
if linkA.isValidURL {
saveData()
} else {
showErrorAlert()
}
}
}
}

你可以使用开关大小写,试试这个

@IBAction func doneButton(_ sender: Any){
switch (linkA.isEmpty, linkB.isEmpty) {
case (true, true):
// no link A, B
saveData()
break
case (false, false):
// no link A, B
if linkA.isValidURL, linkB.isValidURL {
saveData()
}else { showErrorAlert() }
break
case (true, false):
// no link A
linkB.isValidURL  ? saveData() : showErrorAlert()
break
case (false, true):
// no link B
linkA.isValidURL  ? saveData() : showErrorAlert()
break
default:
showErrorAlert()
break
}
}

您可以使用 switch 语句来使您的逻辑更易于理解

switch (linkA.isEmpty, linkB.isEmpty) {
case (true, true):
// do something for both empty
print("both are empty")
case (true, false):
// do something for linkA being empty
print("linkA is empty")
case (false, true):
// do something for linkB being empty
print("linkB is empty")
case (false, false):
// do something for both NOT empty
print("both are not empty")
}

然后,可以创建一个帮助程序函数来显示警报,而不是多次重复相同的代码。

您可以尝试另一种替代方法

@IBAction func doneButton(_ sender: Any) {
let isLinkAValid = linkA.isEmpty ? true : linkA.isValidURL
let isLinkBValid = linkB.isEmpty ? true : linkB.isValidURL
let linkAText = linkA.isEmpty ? "No Link A" :  linkATextField.text!
let linkBText = linkB.isEmpty ? "No Link B" :  linkBTextField.text!
if isLinkAValid && isLinkBValid {
saveData(strLinkA: linkAText, strLinkB: linkBText)
}
else {
showErrorAlert()
}
}

你可以用Rx来管理它,下面是一个例子

@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!
@IBOutlet weak var actionButton: UIButton!
private var disposedBag = DisposeBag()
private func startSettings() {
let obs1 = textField1.rx.text.orEmpty
let obs2 = textField2.rx.text.orEmpty
Observable
.combineLatest(obs1, obs2)
.map { s1, s2 in
return s1.count > 0 && s2.count > 0
}
.debounce(.seconds(1), scheduler: MainScheduler.instance)
.bind(to: actionButton.rx.isEnabled)
.disposed(by: disposedBag)
}

如果文本字段为空,操作按钮将被禁用,等待 1 秒以显示文本字段中的任何更改,在 .map{} 中,您可以根据需要显示警报

相关内容