我不知道如何调用这个场景。假设我有这个可变
let text: String?
它怎么能被编码成我的if条件是这样的:
if (text == nil || Float(text) > 0) {
print("i am in")
}
我一直在调用初始化程序时没有完全匹配
这里有两个问题:
-
文本是
String?
,因此需要展开它才能将其传递给Float()
-
Float()
返回一个可选项,该项也应展开以与>
运算符一起使用。
我会避免强制展开,你可以做一些类似的事情:
let text: String? = nil
if let textString = text, let number = Float(textString) {
if number > 0 {
print("I am in")
}
else {
print("I am out")
}
}
else {
print("I am in")
}
首先,看起来您想要检查文本是否为!=nil,则如果文本是数字,则检查如果文本>0
因为这里有可选的字符串,所以应该有一个特定的字符串来检查字符串文本是否不是nil。然后检查它是否是数字。代码将像这个
extension String {
var isNumber: Bool {
return Double(self) != nil
}
}
然后结合你的条件
if text == nil || (text!.isNumber && Float(text!)! > 0) {
print("i am in")
}
结果会像这个
let text: String? = "2.0" // i am in
let text: String? = nil // i am in
let text: String? = "-1.0" // nothing print
text是可选
if (text == nil) || Float(text ?? "") ?? 0 > 0 {
print("i am in")
}
必须做另外两件事:
-
检查
text
是否为nil
后,必须仍然打开可选的text
才能将其与Float()
构造函数一起使用。在这里,我使用了强制展开!
,这通常是危险的,但我们知道,由于第一次测试,此时text
不能是nil
。如果text
是nil
,则||
使用短路评估返回true而不执行右侧。 -
接下来,
Float(text!)
返回一个Float?
,因为该文本可能无法转换为有效的Float
。为了解开它,我使用了nil合并运算符??
来解开Float
值,或者如果值是nil
,则使用0
。if text == nil || Float(text!) ?? 0 > 0 { print("i am in") }