2016-02-14 58 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)") 
相關問題