是否有可能在缩写斯威夫特这种状况呢?(Is it possible to abbreviate th

2019-10-29 17:46发布

有没有一种方法来简化在斯威夫特以下类型的条件?

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 )

但这些都不奏效。 我也试过在看文档,但无法找到一个类似的例子。

谢谢!

Answer 1:

我不认为有一种方法来简化它像你想,但有,也许,另一种方式来处理同样的事情...

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

通过在调用点变成这样你的条件...

if myEnum.someCondition, startButton.isSelected {
    doTheThing()
}

通过使用这种方法你的代码变得更加易读了。 现在你可以给你的病情哪些其他开发者(包括你的未来的自己)就能理解一个合理的名称。 凡在我不知道为什么这些案件选择。

它还允许您使用在多个地方这种情况,并只有一个实现它。 所以,如果需要改变,你可以在一个地方进行更改。



Answer 2:

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


Answer 3:

对于这种情况,我喜欢用约翰Sundell的扩展equatable:

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

然后,您可以使用它作为:

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


文章来源: Is it possible to abbreviate this condition in Swift?