2017-06-19 50 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)