2016-10-16 4 views
7

Я хочу, чтобы проверить, если строка существует в любом из значений в моем словаресловаря содержит определенное значение быстрого 3

Dictionary<String, AnyObject> 

Я знаю, что массивы имеет .Contains поэтому я думаю, что словарь делает тоже. Xcode рассказывает мне использовать следующее, когда я начинаю печатать содержит

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

Я просто не понимаю, как использовать это я знаю, что внутри я должен вернуть Bool, но я не понимаю, где я ставлю какую строку Я ищу. Любая помощь будет большой.

+0

при использовании сказать кортежи или структуры или класса, часто такой код удобен '(things.map {$ 0.field}). содержит (blah)' – Fattie

ответ

8

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 
} 

В обоих случаях необходимо, чтобы (по желанию) бросить AnyObject к String для того, чтобы сравнить его с заданной строки.

Было бы немного проще со словарем типа Dictionary<String, String>, потому что строки Equatable, и метод contains(element:) могут быть использованы:

let b = countDic.values.contains(givenString) 
2

Поскольку ваши значения: AnyObject - Any в 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 
1

Вам может понадобиться, чтобы узнать основы использования contains(where:) для Dictionary с первым :

Для [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 
Смежные вопросы