2016-02-14 59 views
0

隐式解包可选项可以这样完成。为什么let variable = x语法不适用于三元运算符?

if let foo = foo { 
    print("foo") 
} else { 
    print("bar") 
} 

我在游乐场练习,而我不明白的是为什么我不能用三元运算符做上面的那个。

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

我相信你的第一个例子称为'可选Binding' 。隐含地展开是“一些变化!”。 – Eendje

+0

而你的第二个例子不起作用的原因是因为你在自己的初始值中使用'foo',因此错误:'在它自己的初始值内使用的变量'。 – Eendje

+0

你试图用'let foo = foo'来实现什么 – 2016-02-14 06:36:24

回答

2

if let是一种特殊的Swift格式,允许您在展开Optional时重新绑定标识符。一个let声明本身不能重新绑定在同一范围内声明的标识符。他们的规则。

此外,您不能使用Optional就好像它是一个BooleanType,你正在试图做的(因为条件的?:必须是一个BooleanType)。

另请注意,print返回()(空元组,也称为Void类型的单例实例)。所以没有理由将foo重新绑定到print的返回值。

这工作,但它不是好作风:

foo != nil ? print("set") : print("nil") 

这是良好的作风:

if foo != nil { 
    print("set") 
} else { 
    print("nil") 
} 

或者这样:

print(foo != nil ? "set" : "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)") 
相关问题