2017-06-19 36 views
1

我使用的是斯威夫特,我想知道如何在1行代碼實現這一點:斯威夫特:設置變量,如果不等於零

If a != nil, myVariable = a 

else if a == nil, myVariable = b 

我需要做到這一點,因此與

適合
var myVariable = a { 
    didSet{ 
     //Do something 
    } 
} 

有沒有辦法在1行中做到這一點,所以我不必在別處改變它並觸發didSet {}?

事情是這樣的:

if var myVariable = a 
else myVariable = b { 
    didSet{ 
     //Do something 
    } 
} 

或者......

var if a != nil {myVariable = a} 
else {myVariable = b} { 
    didSet{ 
     //Do something 
    } 
} 

我知道這可能需要一些時間來實現我的意思,我盡我所能來解釋它。

編輯---> 編譯器說:

零合併運算的 '?'

左側具有非可選類型「[[BOOL]]」,所以右側從未使用

治療被迫向下轉換到「[[BOOL]]」爲可選永遠生產「零」

這是它看起來像使用合併運算:

var purchased = 
UserDefaults.standard.array(forKey: "purchased") as! [[Bool]] ?? 
[[true, false], [true, false], [true, false], [true, false], [true, false]] { //a is left, b is right 
    didSet { 
     //Do something 
    } 
} 

任何想法將極大地更加感激ated。謝謝。

回答

4

如何

var myVariable = a ?? b 

這臺MYVARIABLE到除了當==零,然後設置MYVARIABLE到B的情況。 didSet將會以相應的值被調用一次。它被稱爲「零合併運營商」。

您編輯的問題顯示,在你的情況下不能爲零,因爲你強制解包數組(用as!)。相反,你應該有條件地解開它(如?),以便你的代碼可以檢查零,並使用硬編碼的默認值。

+0

感謝您的。現在的問題是a是可選的,b不是。所以根據編譯器,b將永遠不會被使用,因爲它是非可選的。 –

+0

對我來說,這個編譯和完美工作沒有抱怨。文檔中的情況是相同的(a是可選的,b不是)。如果您的上下文更復雜,請在您的問題中添加其他信息。 – Gerriet

+0

它說:「零合併運營商的左側??」有一個非可選類型'[[Bool]]',所以右側從不使用「。對你而言是可選的,而不是?我現在將在帖子中添加我的確切數字。 –

0
//Sets my variable to a if a != nil, else b. 
var myVaraiable = (a != nil ? a : b) 

由於是可選的,b不是,它會更喜歡

var myVariable = (a != nil ? a! : b)