【问题标题】:How to compare one value against multiple values - Swift如何将一个值与多个值进行比较 - Swift
【发布时间】:2015-12-21 09:28:37
【问题描述】:

假设你有代码

if stringValue == "ab" || stringValue == "bc" || stringValue == "cd" {
    // do something
}

有没有办法缩短或美化这个条件(最好不使用switch语句)?我知道这段代码不起作用:

if stringValue == ("ab" || "bc" || "cd") {
    // do something
}

我在其他语言上看到了一些复杂的解决方案,但它们似乎是特定于语言的,不适用于 Swift。任何解决方案将不胜感激。

【问题讨论】:

    标签: swift if-statement


    【解决方案1】:

    只是为了好玩,在String上重载函数怎么样:

    if a.isOneOf("ab", "bc", "cd") {
        print("yes")
    }
    
    extension String {
        @inlinable
        func isOneOf(_ first: String, _ second: String) -> Bool {
            self == first || self == second
        }
        
        @inlinable
        func isOneOf(_ first: String, _ second: String, _ third: String) -> Bool {
            self == first || isOneOf(second, third)
        }
        
        @inlinable
        func isOneOf(_ first: String, _ second: String, _ third: String, _ fourth: String) -> Bool {
            self == first || isOneOf(second, third, fourth)
        }
    }
    

    这为您提供了全面的性能优势,因为编译器将能够根据需要进行内联和尾部调用,但代价是您必须在代码中编写尽可能多的重载,并且也无法传递数组 - 但其他答案也处理这个问题。

    【讨论】:

      【解决方案2】:

      ["some", "array"].contains("value") 的构造可行,但有点烦人:

      1. 它会颠倒您可能想要编写的从左到右的顺序。
      2. 数组中的项未使用 Swift 的类型推断声明,这通常会迫使您包含不必要的信息以取悦编译器。

      您可以改用Set(["value"]).isSubset(of: ["some", "array"])。

      使用枚举的好处尤其明显:

      enum SomeReallyReallyLongTypeName {
          case one, two
      }
      
      struct Thing {
          let value: SomeReallyReallyLongTypeName
      }
          
      let thing = Thing(value: .one)
      
      
      
      if Set([thing.value]).isSubset(of: [.one, .two]){
          // :)
          // Left-to-right order
          // You get nice type inference
      }
      
      if [SomeReallyReallyLongTypeName.one, .two].contains(thing.value) {
          // :(
          // Annoying to have "SomeReallyReallyLongTypeName" in the code
      }
      

      【讨论】:

        【解决方案3】:

        使用 Switch 语句。

        switch stringValue {
        case "ab", "bc", "cd":
            print("Yay!")
        default:
            break     
        }
        

        【讨论】:

          【解决方案4】:
          if someArray.contains(object) {
            // contains
          } else {
            // does not contains
          }
          

          上面的函数返回bool值,然后你写相应的逻辑。

          【讨论】:

            【解决方案5】:
            let a = 1
            let b = 1
            let c = 1
            let d = 1
            if a == b,a==c,a==d  {
                print("all of them are equal")
            }
            else {
                print("not equal")
            }
            

            【讨论】:

            • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
            • 这不是解决方案。您的解决方案检查所有字符串是否相等。该问题要求一种方法来评估是否其中任何一个相等。更改或删除。
            【解决方案6】:

            你可以像这样创建一个扩展:

            extension Equatable {
                func oneOf(other: Self...) -> Bool {
                    return other.contains(self)
                }
            }
            

            并像这样使用它:

            if stringValue.oneOf("ab", "bc", "cd") { ... }
            

            感谢 impl 为我节省了打字时间:https://gist.github.com/daehn/73b6a08b062c81d8c74467c131f78b55/

            【讨论】:

              【解决方案7】:
              let valuesArray = ["ab","bc","cd"]
              
              valuesArray.contains(str) // -> Bool
              

              【讨论】:

              • 你可以这样写:if ["ab", "bc", "cd"].contains(stringValue) {.
              • 确实是个聪明的方法!竖起大拇指!
              【解决方案8】:

              我不知道,不过你可以这样做,

              let validStrings = Set<String>(arrayLiteral:"ab", "bc", "cd")
              if validStrings.contains(str) {
                  //do something      
              }
              

              【讨论】:

              • 真的很好。我真的忘记了这个功能。很高兴你提醒了我。你把它做成一套真的很好,以防万一避免重复:)祝你有美好的一天
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-03-24
              • 2013-10-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多