如何使用三元运算符编写代码?

时间:2018-01-18 09:39:09

标签: ios iphone swift optimization ternary-operator

func checkBtn () {
      //  btnDone.isEnabled = self.contactSelectViewList.count > 0 ? true : false
    if self.contactSelectViewList.count > 0 {
        btnDone.isEnabled = true
    }
    else {
        if arrEmployeeCount?.count > 0 {
             btnDone.isEnabled = true
        }
        else {
            btnDone.isEnabled = false
        }
    }
}

如何使用三元运算符或更优化的方式编写此代码?

4 个答案:

答案 0 :(得分:3)

我推荐这个:

btnDone.isEnabled = contactSelectViewList.count > 0 || (arrEmployeeCount?.count ?? 0) > 0

<强>说明

由于您有条件地将isEnabled设置为布尔值,因此您可以使用该精确条件将值设置为if / else语句或三元运算符。换句话说,如果你正在使用:

if self.contactSelectViewList.count > 0 {
    btnDone.isEnabled = true
}

然后您基本上说:如果self.contactSelectViewList.count > 0true,则将btnDone.isEnabled设置为true

因此,您可以轻松地重构代码,通过将其重写为:

来获得相同的结果
btnDone.isEnabled = self.contactSelectViewList.count > 0

因为如果self.contactSelectViewList.count > 0为真,那么它将被评估为

btnDone.isEnabled = true

否则将评估为:

btnDone.isEnabled = false

现在你的情况有点复杂,因为你有两个条件。但是通过阅读你的代码,我们可以告诉你,当这两个数组中至少有一个计数时,你想要启用按钮&gt;因此我们只需将条件更改为contactSelectViewList.count > 0(arrEmployeeCount?.count ?? 0) > 0。其余的都是一样的。

??运算符使用选项以在左侧为零时提供默认值。因此,如果arrEmployeeCount?.count评估为nil,arrEmployeeCount?.count ?? 0将评估为0,因为我们将其作为默认值提供(我假设如果没有arrEmployeeCount您想要把它看作好像有一个,但是空的。

您可能希望获得的解决方案是:

btnDone.isEnabled = contactSelectViewList.count > 0 || (arrEmployeeCount?.count ?? 0) > 0

当任一阵列不为空时启用按钮。您甚至可以考虑使用isEmpty重构它以获得更好的可读性:

btnDone.isEnabled = !contactSelectViewList.isEmpty || !(arrEmployeeCount ?? []).isEmpty

(如果arrEmployeeCount ?? []arrEmployeeCount,则nil将提供一个空数组

答案 1 :(得分:1)

您可以将条件组合在一起,然后再进行无法优化。

建议不使用三元运算符在这种情况下会使您的代码难以阅读。

if self.contactSelectViewList.count > 0  || arrEmployeeCount?.count > 0 {
    btnDone.isEnabled = true
} else {
    btnDone.isEnabled = false

}  

或更好的解决方案,在更改计数时自动启用禁用按钮

var contactSelectViewList = [Int]()  {
    didSet {
        if !contactSelectViewList.isEmpty ||  (arrEmployeeCount?.count ?? 0) > 0  {
            btnDone.isEnabled = true
        } else {
            btnDone.isEnabled = false

        }
    }
}

var arrEmployeeCount : [Int]? {
    didSet {
        if !contactSelectViewList.isEmpty ||  (arrEmployeeCount?.count ?? 0) > 0  {
            btnDone.isEnabled = true
        } else {
            btnDone.isEnabled = false

        }
    }
}

答案 2 :(得分:1)

根据您的示例,您可以使用ternary(?)运算符执行此操作。

btnDone.isEnabled = contactSelectViewList.count > 0 ? true : (arrEmployeeCount.count > 0 ? true : false)

答案 3 :(得分:0)

我还要添加一个选项:

let isEnabled = (self.contactSelectViewList.count + arrEmployeeCount?.count) > 0
btnDone.isEnabled = isEnabled