可以通过这种方式隐式展开选项。
if let foo = foo {
print("foo")
} else {
print("bar")
}
我在Playground练习,而我不明白为什么我不能使用三元运算符来完成上面的那个。
let foo = foo ? print("foo") : print("bar")
// or
var result:String = (let foo = foo ? print("foo") : print("bar"))
我认为这对于Swift来说是完全正常的,尽管很尴尬,因为三元运算会评估表达式。我怀疑let foo = foo
本身就是Swift必须处理的表达,但那是来自像我这样的Swift新手。
答案 0 :(得分:2)
if let
是一种特殊的Swift表单,允许您在展开Optional
时重新绑定标识符。 let
语句本身不能重新绑定在同一范围内声明的标识符。他们是规则。
此外,您不能使用Optional
,就好像它是BooleanType
,您尝试这样做(因为?:
的条件必须是BooleanType
1}})。
另请注意,print
返回()
(空元组,也称为Void
类型的单例实例)。因此,我没有理由将foo
重新绑定到print
的返回值。
虽然效果不好,但仍有效:
foo != nil ? print("set") : print("nil")
这是一种很好的风格:
if foo != nil {
print("set")
} else {
print("nil")
}
或者这个:
print(foo != nil ? "set" : "nil")
在这种情况下,以下情况更糟,但如果设置需要转换包装值,则是合理的模式,如果为nil则提供默认值:
print(foo.map { _ in "set" } ?? "nil" )
如果您只想打开foo
以便稍后在函数中使用,而不增加大括号嵌套级别,则可以使用guard
:
guard let foo = foo else {
print("nil")
return // you must return or throw or abort here in a guard statement
}
// Here foo has been rebound and is no longer optional.
print("set to \(foo)")