加入布尔值优化Swift

时间:2016-07-02 18:41:18

标签: swift if-statement

有没有更好的方法来编写这个if语句,最终在三个变量中有四个结果?

我看着后卫并切换但是我不确定其中任何一个是否能很好地捕获连接的布尔状态?我可以单独列出四个结果作为联合布尔语句(例如,isPartialResult == true&& calculated == nil,依此类推......)但这不一定更具可读性或效率(更多类型)。谢谢!

case .BinaryOperation(let function):
            if isPartialResult == true {
                if calculated == nil {
                    log += (" \(accumulator) \(symbol)")        // add new op
                } else {
                    log += (" \(symbol)")                       // add symbol to calculated, prepare for new op
                    calculated = nil
                }
            } else {
                if log.characters.count <= 1 {
                    log += (" \(accumulator) \(symbol)")        // start from beginning
                } else {
                    log += (" \(symbol)")                       // restart from equal
                }
            }
            executePendingBinaryOperation()
            pending = pendingBinaryOperationInfo(binaryFunction: function, firstOperand: accumulator)
            isPartialResult = true

3 个答案:

答案 0 :(得分:1)

给出3个值

let isPartialResult = true
let calculated: String?
let log = "hello"

您可以这样使用switch

switch (isPartialResult, calculated, log.characters.count) {
case (true, nil, _): break
case (true, let _, _): break
case (false, _, 0...1): break
case (false, _, 2...Int.max): break
default: fatalError()
}

现在只需用你的结果替换4个中断中的每一个。

答案 1 :(得分:0)

您应该使用def validation_function(text): try: if len(text) <= 5: return True else: return False except: return False 来展开if let ... = ...值(即检查为零)。

calculated

或同样的事情,但if isPartialResult == true { if let _ = calculated { log += (" \(symbol)") calculated = nil } else { log += (" \(accumulator) \(symbol)") } } else { log += log.characters.count <= 1 ? (" \(accumulator) \(symbol)") : (" \(symbol)") }

guard

选择这两个。

答案 2 :(得分:0)

您可以将所有内容刻录到一行,而不使用if语句。

log = isPartialResult ? ((calculated == nil) ? log  +  accumulator/symbol : 3) : ((xyz.count <= 1) ? (log + 10) : 6)

提出问题。我不确定使用三元运算符的缺点是什么。它只是保持我的代码清洁