如何在 swift 中执行逻辑异或运算以找出所有文本字段为空或已满?

How to perform a logical XOR operation in swift to find out all textfields are empty or full?

我正在做一个包含 3 个不同页面的注册模块。第一页个人详细信息,第二页登录详细信息和第三页付款详细信息。虽然注册第一页和第二页是强制性的,但第三页不是。第三页有 6 个文本字段。但是,第 3 页验证用户必须输入所有值或必须将所有字段留空。为此,我需要一个逻辑异或运算,但我不知道如何实现。帮我。我现在使用以下错误的代码

if((txtCardNumber.text!.isEmpty && txtCardType.text!.isEmpty && txtNameofCard.text!.isEmpty && txtMonthExpriy.text!.isEmpty && txtYearExpiry.text!.isEmpty && txtPayment.text!.isEmpty) == false )

我正在使用 Swift 2.0 xcode 7.1.1。所以 ^ 不起作用

任何人都可以为此给出合理的解决方案或替代解决方案吗?

我不会用异或来解决这个问题;我确实意识到它们确实为您的特定问题提供了答案,但通常我不会将它们用于高级逻辑。听得懂 > 聪明。

  1. 他们很难理解;它们代表 space 的解决方案,这些解决方案都是正确的和错误的,但大多数阅读您的代码的人不会理解这一点。尤其是当您第一次查看代码时。
  2. 你会如何修改逻辑?如果你想要求所有 6 个都为空或只有 5 个被填充怎么办?

一般来说,大量的 if 陈述会很快变得难以理解。

这是我想出的解决方案:

//Create a function which determines if all the Bool values in an array are true
func allTrue(booleanValues: [Bool]) -> Bool {
    for bool in booleanValues {
        if bool == false {
            return false
        }
    }
    return true
}

//And a function which determines if all Bool values are false
func allFalse(booleanValues: [Bool]) -> Bool {
    for bool in booleanValues {
        if bool == true {
            return false
        }
    }
    return true
}


//This is a function which determines if a UITextField is empty or not (this could also be written as a standalone function if you need it elsewhere).
//It takes in a UITextField! and returns a Bool
let isTextFieldEmpty: ((textField: UITextField!) -> Bool) = { (textfield) -> Bool in
    return textfield.text?.isEmpty ?? true
}

//Create an array of all of the textfields - this makes it easy to modify if you add or remove a textfield. It's also easy to verify that you didn't miss one of your six textfields in a giant if statement
let textfields = [txtCardNumber, txtCardType, txtNameofCard, txtMonthExpriy, txtYearExpiry, txtPayment]

//Turns the array of textfields into an array of Bool values representing if they are empty; we then use our allTrue() and allFalse() functions.
let textFields = [txtCardNumber, txtCardType, txtNameofCard, txtMonthExpriy, txtYearExpiry, txtPayment]
let textFieldsAreEmpty = textFields.map(isTextFieldEmpty)
if allTrue(textFieldsAreEmpty) || allFalse(textFieldsAreEmpty) {
    //Do the stuff
}

您可以在不需要异或运算符的情况下执行此操作。如果您所有的文本字段都在一个数组中,这应该非常简单。您可以在代码中创建它,也可以使用 IBOutletCollection.

从您的 storyboard/xib 创建它

此代码通过在文本字段上调用 ​​isEmpty 获取所有 Bools,并将它们放入 Set。如果它们全为真或全为假,则该集合将只包含一个值,如果它是 true/false 的混合,则它将有两个值。

let textFields: [UITextField] = ... // an array of the textfields to check
let emptyValues = Set(textFields.map { [=10=].text?.isEmpty ?? true })

if emptyValues.count == 1 {
    print("All textfields are full or empty")
}