Swift 4 erreur de Conversion - NSAttributedStringKey: Tout
J'ai converti mon application récemment et je reçois l'erreur
"Ne peut pas convertir une valeur de type '[Chaîne : Toute]' à attendre argument de type '[NSAttributedStringKey: Tout]?'
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
}
OriginalL'auteur Eazy | 2017-09-20
Vous devez vous connecter pour publier un commentaire.
Pourquoi vous avez eu cette erreur
Précédemment, votre
attributes
est défini comme[String: Any]
, où la clé vient deNSAttributedStringKey
comme une chaîne de caractères.Au cours de la migration, le compilateur essaie de garder le
[String: Any]
type. Cependant,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 avez fourni[String: Any]
Pour corriger cette erreur:
Supprimer
.rawValue
et jeter votreattributes
comme[NSAttributedStringKey: Any]
À savoir, modifiez cette ligne suivante
à
OriginalL'auteur
Ses attend
NSAttributedStringKey
(NSAttributedStringKey.font
) et vous envoyezString
(NSAttributedStringKey.font.rawValue
).Merci donc de remplacer
NSAttributedStringKey.font.rawValue
avecNSAttributedStringKey.font
comme ci-dessous :Mise à jour de la réponse. Veuillez vérifier
J'ai utilisé "laissez les attributs = [NSAttributedStringKey.police: UIFont(nom: "Helvetica-Bold", taille: 15.0)!, NSAttributedStringKey.foregroundColor: UIColor.blanc]" et je reçois toujours le message d'avertissement.
qu'est-ce que l'avertissement?
Cast de " [NSAttributedStringKey : NSObject]' à aucun type '[Chaîne : Toute]' échoue toujours
OriginalL'auteur
Comme indiqué dans les réponses précédentes,
NSAttributedStringKey
a été changé pour un struct dans Swift 4. Cependant, d'autres objets que utilisationNSAttributedStringKey
n'a apparemment pas mis à jour en même temps.Le plus simple correctif, sans avoir à modifier votre code, est à ajouter
.rawValue
à tous votre occurrences deNSAttributedStringKey
setters - tournez la clé de noms dansString
s:Notez que vous n'aurez pas besoin d'
!
à laas
maintenant, soit.Alternativement, vous pouvez sauter le
as
exprimées à la fin en déclarant que la matrice soit[String : Any]
d'avance:Bien sûr, vous avez encore besoin d'ajouter le
.rawValue
pour chaqueNSAttributedStringKey
élément que vous définissez.OriginalL'auteur
leanne réponse est correct 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 convertis attributs (personnalisée):où
toTypingAttributes()
est une fonction définie par l'extension de vos fichiers de projet:OriginalL'auteur