Ik gebruik momenteel de volgende (onhandige) stukjes code om te bepalen of een (niet-leeg) Swift-woordenboek een bepaalde sleutel bevat en om één (willekeurige) waarde uit hetzelfde woordenboek te verkrijgen.
Hoe kan je dit eleganter in Swift zetten?
// 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
}
Antwoord 1, autoriteit 100%
Je hebt geen eenspeciale code nodig om dit te doen, omdat het is wat een woordenboek al doet. Wanneer u dict[key]
ophaalt, weetof het woordenboek de sleutel bevat, omdat het Optioneel dat u terugkrijgt niet nil
is (en het bevat de waarde).
Dus, als je alleende vraag wilt beantwoorden of het woordenboek de sleutel bevat, vraag dan:
let keyExists = dict[key] != nil
Als je de waarde wilt en je weetdat het woordenboek de sleutel bevat, zeg dan:
let val = dict[key]!
Maar als je, zoals gewoonlijk gebeurt, niet weet dat het de sleutel bevat – je wilt het ophalen en gebruiken, maar alleen als het bestaat – gebruik dan iets als if let
:
if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}
Antwoord 2, autoriteit 15%
Waarom niet gewoon controleren op dict.keys.contains(key)
?
Controleren op dict[key] != nil
zal niet werken in gevallen waar de waarde nihil is.
Net als bij een woordenboek [String: String?]
bijvoorbeeld.
Antwoord 3, autoriteit 12%
Het geaccepteerde antwoord let keyExists = dict[key] != nil
werkt niet als de Dictionary de sleutel bevat maar de waarde nul heeft.
Als u er zeker van wilt zijn dat de Dictionary de sleutel helemaal niet bevat, gebruikt u deze (getest in Swift 4).
if dict.keys.contains(key) {
// contains key
} else {
// does not contain key
}
Antwoord 4
Het lijkt erop dat je hebt gekregen wat je nodig hebt van @matt, maar als je een snelle manier wilt om een waarde voor een sleutel te krijgen, of alleen de eerste waarde als die sleutel niet bestaat:
extension Dictionary {
func keyedOrFirstValue(key: Key) -> Value? {
// if key not found, replace the nil with
// the first element of the values collection
return self[key] ?? first(self.values)
// note, this is still an optional (because the
// dictionary could be empty)
}
}
let d = ["one":"red", "two":"blue"]
d.keyedOrFirstValue("one") // {Some "red"}
d.keyedOrFirstValue("two") // {Some "blue"}
d.keyedOrFirstValue("three") // {Some "red”}
Let op, er is geen garantie wat u daadwerkelijk als eerste waarde krijgt, in dit geval gebeurt het gewoon dat u “rood” retourneert.
Antwoord 5
Mijn oplossing voor een cache-implementatie die optionele NSAttributedString opslaat:
public static var attributedMessageTextCache = [String: NSAttributedString?]()
if attributedMessageTextCache.index(forKey: "key") != nil
{
if let attributedMessageText = TextChatCache.attributedMessageTextCache["key"]
{
return attributedMessageText
}
return nil
}
TextChatCache.attributedMessageTextCache["key"] = .some(.none)
return nil
Antwoord 6
if dictionayTemp["quantity"] != nil
{
//write your code
}
Antwoord 7
Als u de waarde van de sleutel wilt retourneren, kunt u deze extensie gebruiken
extension Dictionary {
func containsKey(_ key: Key) -> Value? {
if let index = index(forKey: key){
return self.values[index]
}
return nil
}
}