En traitant une API objC, je reçois un NSDictionary<NSString *, id> *>
qui se traduit par [String : Any]
dans Swift et que j'utilisais pour NSAttributedString.addAttributes:range:.Comment faire pour convertir [String: Any] à [NSAttributedStringKey: Any]
Cependant, cette signature de méthode a maintenant été modifiée avec Xcode 9 et nécessite maintenant un [NSAttributedStringKey : Any]
.
let attr: [String : Any]? = OldPodModule.getMyAttributes()
// Cannot assign value of type '[String : Any]?' to type '[NSAttributedStringKey : Any]?'
let newAttr: [NSAttributedStringKey : Any]? = attr
if let newAttr = newAttr {
myAttributedString.addAttributes(newAttr, range: range)
}
Comment convertir un [String : Any]
à un [NSAttributedStringKey : Any]
?
Merci! Pour être exhaustif, je devais aussi faire l'opération inverse ('[NSAttributedStringKey: Any]' à '[String: Any]') et dans ce cas c'était 'Dictionary (uniqueKeysWithValues: attr.lazy.map {($ 0). key.rawValue, $ 0.value)}) '. –
@Hamish Pourquoi «paresseux»? Est-ce que 'attr.map {/ * ... * /}' ne ferait pas la même chose dans ce cas? –
@MatusalemMarques On obtiendrait le même résultat, mais l'utilisation de lazy évite la création d'un tableau intermédiaire inutile (les paires clé-valeur ne sont répétées qu'une fois et insérées dans le nouveau dictionnaire, avec la transformation donnée appliquée). – Hamish