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

zazmityj  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(216)

我正在做一个注册模块,其中包括3个不同的页面。第一页个人详细信息,第2页登录详细信息和第3页付款详细信息。注册时,第1页和第2页是必填项,但第3页不是。第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,因此^无法正常工作
对此,谁能给予一个合乎逻辑解决办法或其他解决办法?

czfnxgou

czfnxgou1#

你不需要使用xor操作符就可以完成这个操作。如果你的所有文本字段都在一个数组中,这应该很简单。你可以在代码中创建它,也可以使用IBOutletCollection从你的故事板/xib中创建它。
这段代码通过对文本字段调用isEmpty得到所有的Bools,并将它们放入一个Set中。如果它们都为真或都为假,则该集合将只包含一个值,如果它们都为真/假,则它将包含两个值。

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

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

xn1cxnb42#

我不会用XOR来解决这个问题;我知道它们确实为你的特定问题提供了答案,但一般来说,我不会把它们用于高级逻辑。
1.他们很难理解;它们代表了一系列的解决方案,这些解决方案都是真的,都是假的,但是大多数阅读你代码的人不会理解这一点,尤其是当你第一次看代码的时候。
1.如果你想要求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
}

相关问题