检查2个nstextfield中的值是否是单个if语句中的正整数



我有两个文本框。当用户单击按钮时,我需要检查输入文本字段的值是否为正整数。

我尝试使用以下语句来执行此操作:

if ((Int(txta.stringValue))! < 0 ||(Int(txtb.stringValue))! < 0)
{
            // Display error message
}

,但if语句语法似乎存在问题。 Expected ',' separator是产生的错误。

我做错了什么?

请建议。

有两个问题:

  • 二进制运算符(例如||)必须在两个方面具有空格(或无),这就是导致语法错误的原因。(请参阅Swift中空间的规则是什么。)
  • if (Int(txta.stringValue))! < 0不能用于检查整数输入,因为如果字符串为不是整数。

Int(txta.stringValue)如果字符串不是整数,则返回 nil,所以整数输入的可能检查是

if Int(txta.stringValue) == nil || Int(txtb.stringValue) == nil {
    // display error message
}

,但很可能您需要整数值本身(在有效输入的情况下),这就是可选绑定(另请参见我何时应该将可选值与nil进行比较?):

if let a = Int(txta.stringValue), let b = Int(txtb.stringValue) {
    // Valid input, values are in `a` and `b` ...
} else {
    // display error message
}

可以添加其他条件以检查有效范围,例如

if let a = Int(txta.stringValue), let b = Int(txtb.stringValue), a > 0, b > 0 {
    // Valid positive input, values are in `a` and `b` ...
} else {
    // display error message
}

或使用guard

guard let a = Int(txta.stringValue), let b = Int(txtb.stringValue), a > 0, b > 0 else {
    // display error message
    return
}
// Valid positive input, values are in `a` and `b` ...

这是Optional.mapOptional.flatMap

的理想情况
if (Int(textA.stringValue).map{ 0 <= $0 } ?? false) &&
   (Int(textB.stringValue).map{ 0 <= $0 } ?? false) {
}

分解它:

  1. textANSTextField
  2. textA.stringValue是一些非理想的String
  3. Int(textA.stringValue)将文本字段的非访问字符串值转换为 Int?值(又称Optional<Int>)。这是可选的,因为从String转换为Int可能会发生故障(当字符串未编码整数时)
  4. map{ 0 <= $0 }在该Int?上被调用。这是Optional.map,不要与更常见的map函数混淆,例如Array.map。如果可选的值有一定的值,则将提供的闭合应用于它。否则,nil将继续传播。因此,Int(textA.stringValue).map{ 0 <= $0 }的结果是Bool?,具有三个可能的值:
    1. trueOptional.some(true)),意思是文本字段编码一个正(非负)整数。
    2. falseOptional.some(false)),意思是文本字段编码负整数。
    3. nilOptional.none),这意味着文本字段根本没有编码整数。
  5. 使用 nil colescing 运算符(??)将nil案例合并到false情况下。因此,Int(textA.stringValue).map{ 0 <= $0 } ?? false的结果具有2个值:
    1. true的意思是文本字段编码一个正整数。
    2. false表示文本字段编码一个负整数,或者根本不编码一个数字。无论哪种情况,它都不编码正整数
  6. textB重复该过程,并且两个表达式 and ed一起(&&

最新更新