如果在 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{} 中,您可以根据需要显示警报