2016-10-16 23 views
7

tôi muốn kiểm tra xem một chuỗi tồn tại trong bất kỳ giá trị trong từ điển của tôitừ điển chứa một giá trị nhất định nhanh chóng 3

Dictionary<String, AnyObject> 

Tôi biết mảng đã Chứa vì vậy tôi sẽ nghĩ rằng một cuốn từ điển không quá. Xcode nói với tôi để sử dụng sau khi tôi bắt đầu nhập chứa

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

Tôi chỉ không hiểu làm thế nào để sử dụng này, tôi biết bên trong Tôi cần phải trả lại một Bool, nhưng tôi không hiểu nơi tôi đặt những gì Chuỗi Tôi đang tìm kiếm. Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời.

+0

khi bạn đang sử dụng nói tuples hoặc một struct hay class, thường mã như thế này là tiện dụng '(things.map {$ 0.field}). chứa (blah)' – Fattie

Trả lời

8

contains(where:) kiểm tra nếu bất kỳ yếu tố nào của bộ sưu tập thỏa mãn vị từ đã cho, vì vậy trong trường hợp của bạn, nó sẽ là

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

hoặc bôi trực tiếp lên xem values của từ điển:

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

Trong cả hai trường hợp, nó là cần thiết để (tùy chọn) cast AnyObject đến một String để so sánh nó với chuỗi nhất định.

Nó sẽ là một chút dễ dàng hơn với một cuốn từ điển các loại Dictionary<String, String> vì dây là Equatable, và contains(element:) phương pháp có thể được sử dụng:

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

Vì giá trị của bạn là AnyObject - Any trong Swift 3 - bạn phải kiểm tra xem giá trị có phải là một chuỗi hay không. Nếu có, hãy kiểm tra xem giá trị có chứa chuỗi con không.

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 
} 

Tuy nhiên nếu bạn muốn kiểm tra xem bất kỳ giá trị là bằng (chứ không phải chứa) một chuỗi bạn có thể sử dụng cũng là filter chức năng và isEmpty

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

Bạn có thể cần phải học cách sử dụng cơ bản của contains(where:) cho Dictionary đầu tiên :

Đối với [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 

Đối [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 

Như vậy, với [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 

Vì vậy, trong trường hợp của bạn:

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 
Các vấn đề liên quan