В настоящее время я использую следующие (неуклюжие) фрагменты кода для определения, содержит ли (непустой) словарь Swift заданный ключ, и для получения одного (любого) значения из того же словаря.
Как можно выразить это более элегантно в 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
источник
источник
indexForKey
если чувствуете, что это яснее и понятнее; stackoverflow.com/a/29299943/294884cityName:String = dict["city"] ?? ""
?? ""
Ответы:
Вам не нужно никакого специального кода , чтобы сделать это, потому что это то , что словарь уже делает. Когда вы выбираете,
dict[key]
вы знаете , содержит ли словарь ключ, потому что возвращаемое значение Optional отсутствуетnil
(и оно содержит значение).Итак, если вы просто хотите ответить на вопрос, содержит ли словарь ключ, спросите:
Если вам нужно значение и вы знаете, что словарь содержит ключ, скажите:
Но если, как обычно, вы не знаете, что он содержит ключ - вы хотите получить его и использовать, но только если он существует - тогда используйте что-то вроде
if let
:источник
dict.values
.dict.values
непрозрачный. Вы можете ездить на велосипеде, но это все. (Ладно, это еще не все, но приколите меня.) Если вы хотите, чтобы он был преобразован в массив, возьмитеdict.values.array
.let d = ["hey":"ho"]; let s = d["hey"]; print(s)
это необязательно, как всегда.Почему бы просто не проверить
dict.keys.contains(key)
? Проверкаdict[key] != nil
не будет работать в случаях, когда значение равно нулю. Как со словарем,[String: String?]
например.источник
if let val = dict[key]
вы можете использоватьif let val = dict[key] as? String
в этом случае.dict.keys
который создает массив со всеми ключами, затем (2) проверяет каждый ключ по порядку, пока не найдете один (или ни один!). Я понимаю, что вы пытаетесь разобраться с делом[String: String?]
, но очень осторожно с этим решением ...Принятый ответ
let keyExists = dict[key] != nil
не будет работать, если словарь содержит ключ, но имеет значение ноль.Если вы хотите быть уверенным, что в словаре вообще нет ключа, используйте его (протестировано в Swift 4).
источник
== nil
работает, даже если в словаре есть необязательные значения. Это потому, что результат поиска обернут какOptional
. С другой стороны, чтобы проверить, является ли искомое значение действительно,nil
а не отсутствует, вы можете использовать== .some(nil)
.O(1)
. Смотрите также: github.com/apple/swift-evolution/blob/master/proposals/… Что заставило вас так думатьO(n)
?Dictionary.Keys.contains(...)
функции здесь говорит, что она имеетO(n)
сложность, гдеn
длина последовательности.Похоже, вы получили то, что вам нужно от @matt, но если вы хотите быстрый способ получить значение для ключа или просто первое значение, если этот ключ не существует:
Обратите внимание, нет никаких гарантий, что вы на самом деле получите в качестве первого значения, просто в этом случае возвращается «красный».
источник
??
оператора мое удобное решение было принято у меня, но в качестве расширения значение по умолчанию могло представлять отсутствие безопасности данных или неожиданное поведение. Это звучит как что-то, чтоDictionary
должен использовать конкретный подкласс . Как часто вам нужно первое значение в случаеnil
возврата, исключая специфические для конкретной ситуации функции?источник
Мое решение для реализации кэша, который хранит необязательный NSAttributedString:
источник
Вот что у меня работает на Swift 3
источник