可以在Swift中缩写这个条件吗?

时间:2018-02-09 13:13:14

标签: swift enums conditional-statements operator-keyword

有没有办法在Swift中缩写以下类型的条件?

if ( (myEnum == .1 || myEnum == .2 || myEnum == .3 || myEnum == .8) && startButton.isSelected ) 

我尝试输入:

if ( (myEnum == .1 || .2 || .3 || .8) && startButton.isSelected ) 

if ( (myEnum == .1,.2,.3,.8) && startButton.isSelected )

但这些都没有奏效。我也试过看文档,但找不到类似的例子。

谢谢!

3 个答案:

答案 0 :(得分:8)

我认为没有办法像你想要的那样缩写它,但也许还有另一种方法来接近同样的事情......

import subprocess

    commands = '''
    bashcmd1
    bashcmd2
    bashcmd3
    '''

    process = subprocess.Popen('/bin/bash', stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    out, err = process.communicate(commands)
    print out

通过这样做,您在呼叫站点的条件变为......

extension YourEnum {
    var someCondition: Bool {
        switch self {
        case .1, .2, .3, .8:
            return true
        default:
            return false
        }
    }
}

通过使用这种方法,您的代码也变得更具可读性。您现在可以为您的条件提供一个合理的名称,其他开发人员(包括您未来的自己)将能够理解。以前我不知道为什么选择这些案件。

它还允许您在多个位置使用此条件,并且只有一个实现。因此,如果需求发生变化,您可以在一个地方进行更改。

答案 1 :(得分:5)

if [.a, .b, .c, .d].contains(myEnum) && startButton.isSelected {
    // etc.
}

答案 2 :(得分:3)

对于这种情况,我喜欢使用John Sundell的扩展等同于:

extension Equatable {
    func isAny(of candidates: Self...) -> Bool {
        return candidates.contains(self)
    }
}

然后您可以将其用作:

if myEnum.isAny(of: .1, .2, .3, .8) && startButton.isSelected { .. }