检查单个If语句中2个NSTextFields中的值是否为正整数

时间:2017-10-01 17:29:25

标签: swift macos

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

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

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

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

我做错了什么?

请指教。

2 个答案:

答案 0 :(得分:3)

有两个问题:

  • 二元运算符(例如||)必须在两个侧都有空格 (或者没有),这就是导致语法错误的原因。 (见what are the rules for spaces in swift。)
  • if (Int(txta.stringValue))! < 0不能用于检查整数 输入,因为如果字符串是强制解包在运行时崩溃 不是整数。
如果字符串不是整数,则

Int(txta.stringValue)返回nil,所以 可能检查整数输入

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

但很可能你自己需要整数值(在有效输入的情况下), 这就是可选绑定的用途 (另见When should I compare an optional value to 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` ...

答案 1 :(得分:0)

这是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?值(a.k.a。Optional<Int>)。它是可选的,因为从StringInt的转换可能会失败(当字符串不编码整数时)
  4. map{ 0 <= $0 }上调用
  5. 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),表示文本字段根本不对整数进行编码。
  6. 使用 nil coalescing 运算符(??)将nil个案合并到false个案中。因此,Int(textA.stringValue).map{ 0 <= $0 } ?? false的结果有2个值:
    1. true表示文本字段编码正整数。
    2. false表示文本字段对负整数进行编码,或者根本不对数字进行编码。在任何一种情况下,它都不编码正整数
  7. textB重复此过程,两个表达式一起编辑(&&