Ponieważ jesteś zainteresowany tylko w dowolna wartość dopasowywania, można użyć metoda indexOf()
znajdowania pierwszego pasującego wpisu słownikowego. Działa to, ponieważ słownik jest zbiorem par klucz/wartość.
Swift 2:
let dict = ["foo": "bar", "PQRS": "baz"]
let searchTerm = "S"
if let index = dict.indexOf({ (key, _) in key.containsString(searchTerm) }) {
let value = dict[index].1
print(value)
} else {
print("no match")
}
Jak tylko klucz zostanie znaleziony, predykat zwraca true
i wyliczenie zatrzyma. index
to "indeks słownika", który można użyć bezpośrednio, aby uzyskać odpowiedni wpis słownika.
dla przypadku niewrażliwe poszukiwaniu klucza, wymienić orzeczenie przez
{
(key, _) in key.rangeOfString(searchTerm, options: .CaseInsensitiveSearch) != nil
}
W Swift 3 można użyć first(where:)
aby znaleźć pierwsze dopasowanie elementu, to zapisuje jeden słownik odnośnika:
if let entry = dict.first(where: { (key, _) in key.contains(searchTerm) }) {
print(entry.value)
} else {
print("no match")
}
W przypadku wyszukiwania klucza niewrażliwego na wielkość liter, zastąp predykat przez
{
(key, _) in key.range(of: searchTerm, options: .caseInsensitive) != nil
}
jeśli nie potrzebuję rozróżniania wielkości liter, ponieważ wiem, że ciągi znaków są pełne, czy mogę użyć key.contains() zamiast key.range() czy key.range() szybciej? – Adeline
@Adeline: Nie sądzę, że to robi różnicę, ale 'key.contains()' jest prostsze, więc użyłbym tego. –
Wszystkie trzy odpowiedzi są ważne, ale jego jedna jest najszybsza. – Adeline