如果在 Swift 中满足条件,则保存 TextField 输入的最佳方法
Best way to save TextField inputs if conditions are met in Swift
我有 2 个带有表示 URL 的字符串的文本字段。如果文本字段为空,则保存自定义字符串("no link A"),如果已填充,则需要有效,否则显示警报。
有没有比使用这么多 "if statements" 更简洁的方法来执行此操作?
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()
}
}
}
}
或者你可以使用 Switch case,试试这个
@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{} 中,您可以根据需要显示警报
我有 2 个带有表示 URL 的字符串的文本字段。如果文本字段为空,则保存自定义字符串("no link A"),如果已填充,则需要有效,否则显示警报。
有没有比使用这么多 "if statements" 更简洁的方法来执行此操作?
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()
}
}
}
}
或者你可以使用 Switch case,试试这个
@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{} 中,您可以根据需要显示警报