我有两个文本框。当用户单击按钮时,我需要检查输入文本字段的值是否为正整数。
我尝试使用以下语句来执行此操作:
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.map
和Optional.flatMap
:
if (Int(textA.stringValue).map{ 0 <= $0 } ?? false) &&
(Int(textB.stringValue).map{ 0 <= $0 } ?? false) {
}
分解它:
-
textA
是NSTextField
。 -
textA.stringValue
是一些非理想的String
值 -
Int(textA.stringValue)
将文本字段的非访问字符串值转换为Int?
值(又称Optional<Int>
)。这是可选的,因为从String
转换为Int
可能会发生故障(当字符串未编码整数时) -
map{ 0 <= $0 }
在该Int?
上被调用。这是Optional.map
,不要与更常见的map
函数混淆,例如Array.map
。如果可选的值有一定的值,则将提供的闭合应用于它。否则,nil
将继续传播。因此,Int(textA.stringValue).map{ 0 <= $0 }
的结果是Bool?
,具有三个可能的值:-
true
(Optional.some(true)
),意思是文本字段编码一个正(非负)整数。 -
false
(Optional.some(false)
),意思是文本字段编码负整数。 -
nil
(Optional.none
),这意味着文本字段根本没有编码整数。
-
- 使用 nil colescing 运算符(
??
)将nil
案例合并到false
情况下。因此,Int(textA.stringValue).map{ 0 <= $0 } ?? false
的结果具有2个值:-
true
的意思是文本字段编码一个正整数。 -
false
表示文本字段编码一个负整数,或者根本不编码一个数字。无论哪种情况,它都不编码正整数
-
-
textB
重复该过程,并且两个表达式 and ed一起(&&
)