32 votes

Erreur de conversion Swift 4 - NSAttributedStringKey: Any

J'ai converti mon application récemment et je reçois toujours l'erreur

"Impossible de convertir la valeur de type '[String: Any]' en type d'argument attendu '[NSAttributedStringKey: Any]?'

barButtonItem.setTitleTextAttributes(attributes, for: .normal)

Code entier:

  class func getBarButtonItem(title:String) -> UIBarButtonItem {
    let barButtonItem = UIBarButtonItem.init(title: title, style: .plain, target: nil, action: nil)
    let attributes = [NSAttributedStringKey.font.rawValue:  UIFont(name: "Helvetica-Bold", size: 15.0)!, NSAttributedStringKey.foregroundColor: UIColor.white] as! [String : Any]
    barButtonItem.setTitleTextAttributes(attributes, for: .normal)

    return barButtonItem
}
 

52voto

Fangming Points 10276

Pourquoi vous avez eu cette erreur

Précédemment, votre attributes est défini comme [String: Any], où la clé vient d' NSAttributedStringKey chaîne ou NSAttributedString.Key en Swift 4.2

Au cours de la migration, le compilateur essaie de garder l' [String: Any] type. Toutefois, NSAttributedStringKey devient un struct dans swift 4. Ainsi, le compilateur essaie de changer de chaîne en obtenant sa valeur brute.

Dans ce cas, setTitleTextAttributes est à la recherche d' [NSAttributedStringKey: Any] mais vous fournis [String: Any]

Pour corriger cette erreur:

Retirez .rawValue et jeter votre attributes comme [NSAttributedStringKey: Any]

À savoir, modifiez cette ligne suivante

let attributes = [NSAttributedStringKey.font.rawValue:
    UIFont(name: "Helvetica-Bold", size: 15.0)!, 
    NSAttributedStringKey.foregroundColor: UIColor.white] as! [String : Any]

pour

let attributes = [NSAttributedStringKey.font:
    UIFont(name: "Helvetica-Bold", size: 15.0)!, 
    NSAttributedStringKey.foregroundColor: UIColor.white] as! [NSAttributedStringKey: Any]

Et dans Swift 4.2,

 let attributes = [NSAttributedString.Key.font:
    UIFont(name: "Helvetica-Bold", size: 15.0)!, 
    NSAttributedString.Key.foregroundColor: UIColor.white] as! [NSAttributedStringKey: Any]

16voto

Vini App Points 4968

Il attend NSAttributedStringKey ( NSAttributedStringKey.font ) et vous envoyez String ( NSAttributedStringKey.font.rawValue ).

Veuillez donc remplacer NSAttributedStringKey.font.rawValue par NSAttributedStringKey.font comme ci-dessous:

 let attributes = [NSAttributedStringKey.font:  UIFont(name: "Helvetica-Bold", size: 15.0)!, NSAttributedStringKey.foregroundColor: UIColor.white]
 

5voto

leanne Points 766

Comme indiqué dans les réponses précédentes, NSAttributedStringKey a été changé pour un struct dans Swift 4. Cependant, d'autres objets d'utilisation NSAttributedStringKey n'a apparemment pas mis à jour en même temps.

La méthode la plus simple de résoudre, sans avoir à modifier votre code, est à ajouter .rawValue de tous vos événements d' NSAttributedStringKey setters - tournez la clé de noms en Strings:

let attributes = [
    NSAttributedStringKey.font.rawValue:  UIFont(name: "Helvetica-Bold", size: 15.0)!,
    NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
] as [String : Any]

Notez que vous n'aurez pas besoin d' ! à la as maintenant, soit.

Sinon, vous pouvez sauter l' as exprimés à la fin en déclarant que la matrice soit [String : Any] d'avance:

let attributes: [String : Any] = [
    NSAttributedStringKey.font.rawValue:  UIFont(name: "Helvetica-Bold", size: 15.0)!,
    NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
]

Bien sûr, vous avez encore besoin d'ajouter l' .rawValue pour chaque NSAttributedStringKey de l'élément que vous avez défini.

3voto

roxanneM Points 388

leanne réponse est correcte pour le cas où vous avez encore besoin d'utiliser [String : Any] et pas [NSAttributedStringKey : Any].

Par exemple, dans UIKit UITextView.typingAttributes est toujours de type [String : Any]. Donc pour cette propriété, vous devez utiliser converti les attributs (y compris ceux personnalisées):

let customAttributeName = "MyCustomAttributeName"
let customValue: CGFloat = 15.0

let normalTextAttributes: [NSAttributedStringKey : Any] =
            [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 14.0),
             NSAttributedStringKey.foregroundColor : UIColor.blue,
             NSAttributedStringKey.backgroundColor : UIColor.clear,
             NSAttributedStringKey(rawValue: customAttributeName): customValue]

textView.typingAttributes = normalTextAttributes.toTypingAttributes()

toTypingAttributes() est une fonction définie par l'extension de vos fichiers de projet:

extension Dictionary where Key == NSAttributedStringKey {
    func toTypingAttributes() -> [String: Any] {
        var convertedDictionary = [String: Any]()

        for (key, value) in self {
            convertedDictionary[key.rawValue] = value
        }

        return convertedDictionary
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X