web-dev-qa-db-ja.com

辞書には特定の値が含まれていますSwift 3

辞書の値のいずれかに文字列が存在するかどうかを確認したい

Dictionary<String, AnyObject>

配列には.containsがあるので、辞書にもあると思います。 Xcodeは、次を入力し始めるときに次を使用するように指示します。

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

ブール値を返す必要があることを知っているので、これを使用する方法がわかりませんが、探している文字列をどこに置くかはわかりません。どんな助けでも素晴らしいでしょう。

8
Jevon Charles

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にキャストする必要があります。

文字列はEquatableであり、contains(element:)メソッドを使用できるため、タイプ_Dictionary<String, String>_の辞書を使用すると少し簡単になります。

_let b = countDic.values.contains(givenString)
_
10
Martin R

値はAnyObjectAny in Swift 3-であるため、値が文字列であるかどうかを確認する必要があります。はいの場合は、値にサブ文字列が含まれているかどうかを確認してください。

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関数とisEmptyも使用できます。

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

最初にDictionarysのcontains(where:)の基本的な使用法を学ぶ必要があるかもしれません。

にとって [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
1
OOPer