为什么let variable = x语法不能与三元运算符一起使用?

时间:2016-02-14 06:20:55

标签: swift swift2

可以通过这种方式隐式展开选项。

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新手。

1 个答案:

答案 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)")
相关问题