Atualmente, estou usando os seguintes (desajeitados) trechos de código para determinar se um dicionário Swift (não vazio) contém uma determinada chave e para obter um (qualquer) valor do mesmo dicionário.
Como se pode colocar isso de maneira mais elegante no 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
fonte
fonte
indexForKey
se achar que é mais claro e mais explícito; stackoverflow.com/a/29299943/294884cityName:String = dict["city"] ?? ""
O?? ""
aqui significa basicamente "se não houver essa chave, retorne um espaço em branco".Respostas:
Você não precisa de nenhum código especial para fazer isso, porque é o que um dicionário já faz. Quando você buscar
dict[key]
você sabe se o dicionário contém a chave, porque o opcional que você recebe de volta não énil
(e contém o valor).Portanto, se você quiser apenas responder à pergunta se o dicionário contém a chave, pergunte:
Se você deseja o valor e sabe que o dicionário contém a chave, diga:
Mas se, como geralmente acontece, você não sabe que ela contém a chave - você deseja buscá-la e usá-la, mas apenas se existir -, use algo como
if let
:fonte
dict.values
.dict.values
é opaco. Você pode andar de bicicleta, mas é tudo. (Ok, não é tudo, mas me humor.) Se você quiser que seja reificado para uma matriz, aceitedict.values.array
.let d = ["hey":"ho"]; let s = d["hey"]; print(s)
É um opcional, como sempre foi.Por que não simplesmente procurar
dict.keys.contains(key)
? A verificaçãodict[key] != nil
não funcionará nos casos em que o valor for nulo. Como em um dicionário,[String: String?]
por exemplo.fonte
if let val = dict[key]
você pode usarif let val = dict[key] as? String
neste caso.dict.keys
que cria uma matriz com todas as chaves e, em seguida, (2) verifica todas as chaves em ordem até encontrar uma (ou nenhuma!). Eu sei que você está tentando resolver o caso de um[String: String?]
, mas seria muito cuidado com essa solução ...A resposta aceita
let keyExists = dict[key] != nil
não funcionará se o Dicionário contiver a chave, mas tiver um valor nulo.Se você quiser ter certeza de que o Dicionário não contém a chave, use isso (testado no Swift 4).
fonte
== nil
funciona, mesmo se o dicionário tiver valores opcionais. Isso ocorre porque o resultado da pesquisa é agrupado como umOptional
. Por outro lado, para verificar se o valor pesquisado é realmente,nil
e não ausente, você pode usar== .some(nil)
.O(1)
. Veja também: github.com/apple/swift-evolution/blob/master/proposals/… O que fez você pensar que eraO(n)
?Dictionary.Keys.contains(...)
função aqui diz que temO(n)
complexidade, onden
está o comprimento da sequência.Parece que você obteve o que precisa em @matt, mas se desejar uma maneira rápida de obter um valor para uma chave ou apenas o primeiro valor, se essa chave não existir:
Observe que não há garantia do que você realmente obterá como o primeiro valor; neste caso, acontece apenas para retornar "vermelho".
fonte
??
operador tirou de mim minha solução de conveniência, mas como uma extensão desse valor padrão, poderia apresentar insegurança nos dados ou comportamentos inesperados. Isso soa como algo que uma subclasse concretaDictionary
deveria empregar. Com que frequência você precisa do primeiro valor em caso denil
retorno, excluindo a funcionalidade específica da situação?fonte
Minha solução para uma implementação de cache que armazena NSAttributedString opcional:
fonte
Aqui está o que funciona para mim no Swift 3
fonte