【问题标题】:Dictionary contains a certain value swift 3字典包含某个值 swift 3
【发布时间】:2017-05-08 19:28:42
【问题描述】:

我想检查一个字符串是否存在于我的字典中的任何值中

Dictionary<String, AnyObject>

我知道数组有 .contains,所以我认为字典也有。当我开始输入 contains 时,Xcode 告诉我使用以下内容

countDic.contains(where: { ((key: String, value: AnyObject)) -> Bool in
            <#code#>
        })

我只是不明白如何使用这个我知道我需要返回一个 Bool,但我不明白我在哪里放置了我正在寻找的字符串。任何帮助都会很棒。

【问题讨论】:

  • 当您使用元组或结构或类时,通常这样的代码很方便(things.map{$0.field}).contains(blah)

标签: dictionary swift3


【解决方案1】:

contains(where:) 检查集合的任何元素是否满足 给定的谓词,所以在你的情况下它会是

let b = countDic.contains { (key, value) -> Bool in
    value as? String == givenString
}

或者,直接应用于字典的values视图:

let b = countDic.values.contains { (value) -> Bool in
    value as? String == givenString
}

在这两种情况下,都需要(可选)强制转换 AnyObjectString 以便将其与给定的字符串进行比较。

使用类型的字典会稍微容易一些 Dictionary&lt;String, String&gt; 因为字符串是Equatable, 并且可以使用contains(element:) 方法:

let b = countDic.values.contains(givenString)

【讨论】:

    【解决方案2】:

    由于您的值在 Swift 3 中是 AnyObjectAny - 您必须检查该值是否为字符串。如果是,请检查该值是否包含子字符串。

    let countDic : [String:Any] = ["alpha" : 1, "beta" : "foo", "gamma" : "bar"]
    
    countDic.contains { (key, value) -> Bool in
      if let string = value as? String { return string.contains("oo") }
      return false
    }
    

    但是,如果您想检查任何值是否等于(而不是包含)字符串,您还可以使用filter 函数和@987654325 @

    !countDic.filter { (key, value) -> Bool in
      value as? String == "foo"
    }.isEmpty
    

    【讨论】:

      【解决方案3】:

      您可能需要先了解contains(where:)Dictionarys 的基本用法:

      对于[String: Int]

      let myIntDict1: [String: Int] = [
          "a" : 1,
          "b" : 101,
          "c" : 2
      ]
      let myIntDict1ContainsIntGreaterThan100 = myIntDict1.contains {
          key, value in //<- `value` is inferred as `Int`
          value > 100 //<- true when value > 100, false otherwise
      }
      print(myIntDict1ContainsIntGreaterThan100) //->true
      

      对于[String: String]

      let myStringDict1: [String: String] = [
          "a" : "abc",
          "b" : "def",
          "c" : "ghi"
      ]
      let myStringDict1ContainsWordIncludingLowercaseE = myStringDict1.contains {
          key, value in //<- `value` is inferred as `String`
          value.contains("e") //<- true when value contains "e", false otherwise
      }
      print(myStringDict1ContainsWordIncludingLowercaseE) //->true
      

      所以,[String: AnyObject]:

      let myAnyObjectDict1: [String: AnyObject] = [
          "a" : "abc" as NSString,
          "b" : 101 as NSNumber,
          "c" : "ghi" as NSString
      ]
      let myAnyObjectDict1ContainsWordIncludingLowercaseE = myAnyObjectDict1.contains {
          key, value in //<- `value` is inferred as `AnyObject`
          //`AnyObject` may not have the `contains(_:)` method, so you need to check with `if-let-as?`
          if let stringValue = value as? String {
              return value.contains("e") //<- true when value is a String and contains "e"
          } else {
              return false //<- false otherwise
          }
      }
      print(myAnyObjectDict1ContainsWordIncludingLowercaseE) //->false
      

      所以,在你的情况下:

      let countDic: [String: AnyObject] = [
          "a" : 1 as NSNumber,
          "b" : "no" as NSString,
          "c" : 2 as NSNumber
      ]
      let countDicContainsString = countDic.contains {
          key, value in //<- `value` is inferred as `AnyObject`
          value is String //<- true when value is a String, false otherwise
      }
      print(countDicContainsString) //->true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多