Obecnie używam następujących (niezdarnych) fragmentów kodu do ustalenia, czy (niepusty) słownik Swift zawiera dany klucz i do uzyskania jednej (dowolnej) wartości z tego samego słownika.
Jak bardziej elegancko umieścić to w Swift?
// excerpt from method that determines if dict contains key
if let _ = dict[key] {
return true
}
else {
return false
}
// excerpt from method that obtains first value from dict
for (_, value) in dict {
return value
}
swift
dictionary
Drux
źródło
źródło
indexForKey
jeśli uważasz, że jest to bardziej jasne i wyraźne; stackoverflow.com/a/29299943/294884cityName:String = dict["city"] ?? ""
?? ""
Odpowiedzi:
Nie potrzebujesz do tego żadnego specjalnego kodu, ponieważ to właśnie robi już słownik. Gdy pobierasz
dict[key]
, wiesz, czy słownik zawiera klucz, ponieważ opcjonalny, który otrzymasz, nie jestnil
(i zawiera wartość).Jeśli więc chcesz tylko odpowiedzieć na pytanie, czy słownik zawiera klucz, zapytaj:
Jeśli chcesz tę wartość i wiesz, że słownik zawiera klucz, powiedz:
Ale jeśli, jak to zwykle bywa, nie wiesz, że zawiera on klucz - chcesz go pobrać i użyć, ale tylko jeśli istnieje - użyj czegoś takiego
if let
:źródło
dict.values
.dict.values
jest nieprzejrzysty. Możesz jeździć na rowerze, ale to wszystko. (Okej, to nie wszystko, ale żartuj.) Jeśli chcesz, aby zmieniło się w tablicę, weźdict.values.array
.let d = ["hey":"ho"]; let s = d["hey"]; print(s)
Jest to opcja, tak jak zawsze była.Dlaczego nie po prostu sprawdzić
dict.keys.contains(key)
? Sprawdzaniedict[key] != nil
nie zadziała w przypadkach, gdy wartość wynosi zero. Jak[String: String?]
na przykład w słowniku .źródło
if let val = dict[key]
, możesz użyćif let val = dict[key] as? String
w tym przypadku.dict.keys
wywołujesz tablicę ze wszystkimi kluczami, a następnie (2) sprawdza kolejno każdy klucz, aż znajdziesz jeden (lub żaden!). Zdaję sobie sprawę, że próbujesz zająć się przypadkiem[String: String?]
, ale bardzo ostrożnie podchodziłbyś do tego rozwiązania ...Akceptowana odpowiedź
let keyExists = dict[key] != nil
nie zadziała, jeśli Słownik zawiera klucz, ale ma wartość zero.Jeśli chcesz mieć pewność, że słownik nie zawiera klucza, skorzystaj z niego (testowane w Swift 4).
źródło
== nil
działa, nawet jeśli słownik ma opcjonalne wartości. Wynika to z tego, że wynik wyszukiwania jest zawijany jakoOptional
. Z drugiej strony, aby sprawdzić, czy szukana wartość jest rzeczywiścienil
raczej nieobecna, możesz użyć== .some(nil)
.O(1)
. Zobacz także: github.com/apple/swift-evolution/blob/master/propozycje/… Co sprawiło, że tak myśliszO(n)
?Dictionary.Keys.contains(...)
funkcji mówi, że ma złożoność, gdzie jest długość sekwencji.O(n)
n
Wygląda na to, że masz to, czego potrzebujesz od @matt, ale jeśli chcesz szybko uzyskać wartość klucza lub po prostu pierwszą wartość, jeśli ten klucz nie istnieje:
Uwaga: nie ma gwarancji, co faktycznie otrzymasz jako pierwszą wartość, po prostu w tym przypadku zwraca się „czerwony”.
źródło
??
operatora odebrało mi moje wygodne rozwiązanie, ale jako rozszerzenie tej wartości domyślnej może pojawić się niepewność danych lub nieoczekiwane zachowania. To brzmi jak coś, coDictionary
powinna zastosować konkretna podklasa . Jak często potrzebujesz pierwszej wartości w przypadkunil
zwrotu z wyłączeniem funkcji specyficznych dla sytuacji?źródło
Moje rozwiązanie dla implementacji pamięci podręcznej przechowującej opcjonalne NSAttributString:
źródło
Oto, co działa dla mnie w Swift 3
źródło