【问题标题】:Swift: Setting variables if not equalling nilSwift:如果不等于 nil 则设置变量
【发布时间】:2017-11-21 06:00:08
【问题描述】:

我正在使用 Swift,我想知道如何在 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
    }
}

我知道这可能需要一些时间才能理解我的意思,我已尽力解释它。

编辑---> 编译器说:

nil 合并运算符 '??' 的左侧有一个非可选类型 '[[Bool]]',所以从不使用右侧

将强制向下转换为 '[[Bool]]' 作为可选将永远不会产生 'nil'

这是使用合并运算符的样子:

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
    }
}

任何想法将不胜感激。谢谢。

【问题讨论】:

    标签: swift optional var


    【解决方案1】:

    怎么样

    var myVariable = a ?? b
    

    这会将 myVariable 设置为 a(a == nil 的情况除外),然后将 myVariable 设置为 b。 didSet 将使用相应的值调用一次。它被称为“零合并运算符”。

    您编辑的问题表明,在您的情况下 a 不能为零,因为您强制解开数组(使用 as!)。相反,您应该有条件地打开它(as?),以便您的代码可以检查 nil 并使用硬编码的默认值。

    【讨论】:

    • 谢谢。现在的问题是 a 是可选的,而 b 不是。所以根据编译器,b 永远不会被使用,因为它是非可选的。
    • 对我来说,它可以完美地编译和运行,没有任何抱怨。文档中的情况是相同的(a 是可选的,b 不是)。如果您的上下文更复杂,请在您的问题中添加其他信息。
    • 它说:“零合并运算符的左侧'??'有一个非可选类型 '[[Bool]]',所以从不使用右侧”。 a 对你来说是可选的,b 不是吗?我现在将在帖子中添加我的确切数字。
    • 左边是a。如果 a 是非可选的,那么这个问题没有意义,你可以做 var myVariable = a (因为它永远不会是 nil)。
    • a 是可选的,b 不是。
    【解决方案2】:
    //Sets my variable to a if a != nil, else b.
    var myVaraiable = (a != nil ? a : b)
    

    由于 a 是可选的而 b 不是,它会更像

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

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 2012-11-17
      相关资源
      最近更新 更多