我有两个文本框。当用户点击按钮时,我需要检查输入到文本字段中的值是否为正整数。
我尝试使用以下语句执行此操作:
if ((Int(txta.stringValue))! < 0 ||(Int(txtb.stringValue))! < 0)
{
// Display error message
}
但似乎if
语句语法存在问题。
Expected ',' separator
是产生的错误。
我做错了什么?
请指教。
答案 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.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?
值(a.k.a。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
个案合并到false
个案中。因此,Int(textA.stringValue).map{ 0 <= $0 } ?? false
的结果有2个值:
true
表示文本字段编码正整数。false
表示文本字段对负整数进行编码,或者根本不对数字进行编码。在任何一种情况下,它都不编码正整数textB
重复此过程,两个表达式和一起编辑(&&
)