Je viens de mettre à jour Xcode 9 et de convertir mon application de Swift 3 à Swift 4 . J'ai des graphiques qui utilisent des chaînes pour étiqueter les axes et autres variables . J'ai donc un moneyAxisString = "Money" ..__ Auparavant, je pouvais les dessiner en utilisant ce code:
moneyAxisString.draw(in: CGRect(x: CGFloat(coordinateXOriginLT + axisLength/3), y: CGFloat(coordinateYOriginRT + axisLength + 5 * unitDim), width: CGFloat(300 * unitDim), height: CGFloat(100 * unitDim)), withAttributes: attributes as? [String : AnyObject])
Où attributs est un dictionnaire défini comme suit
attributes = [
NSAttributedStringKey.foregroundColor: fieldColor,
NSAttributedStringKey.font: fieldFont!,
NSAttributedStringKey.paragraphStyle: style
]
Maintenant, mon application ne va pas compiler et je reçois le message suivant:
Impossible de convertir la valeur de type '[String: AnyObject]?' au type d'argument attendu '[NSAttributedStringKey: Any]?'
C'est une incompatibilité de type: [String : AnyObject]
n'est clairement pas [NSAttributedStringKey : Any]
⌥-click sur NSAttributedStringKey
pour voir la déclaration.
La solution consiste à déclarer attributes
comme
var attributes = [NSAttributedStringKey : Any]()
enlever le plâtre
..., withAttributes: attributes)
et d'écrire simplement
attributes = [.foregroundColor: fieldColor,
.font: fieldFont!,
.paragraphStyle: style]
NSAttributedStringKey
a été remplacé par une structure dans Swift 4. Cependant, d'autres objets qui useNSAttributedStringKey
n'ont apparemment pas été mis à jour en même temps.
La solution la plus simple, sans changer aucun autre code, consiste à ajouter .rawValue
à all vos occurrences de NSAttributedStringKey
setters - en transformant les noms de clé en String
s:
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 plus besoin du !
à la as
maintenant.
Vous pouvez également ignorer la distribution as
à la fin en déclarant que le tableau est [String : Any]
dès le départ:
let attributes: [String : Any] = [
NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
]
Bien sûr, vous devez toujours ajouter le .rawValue
pour chaque élément NSAttributedStringKey
que vous avez défini.
Essaye ça:
class func getCustomStringStyle() -> [NSAttributedStringKey: Any]
{
return [
NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue): UIFont.systemFont(ofSize: 16), // or your fieldFont
NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue): UIColor.black, // or your fieldColor
NSAttributedStringKey(rawValue: NSAttributedStringKey.paragraphStyle.rawValue): NSParagraphStyle.default // or your style
]
}
ou:
class func getCustomStringStyle() -> [String: Any]
{
return [
NSAttributedStringKey.font.rawValue: UIFont.systemFont(ofSize: 16),
NSAttributedStringKey.foregroundColor.rawValue: UIColor.black,
NSAttributedStringKey.paragraphStyle.rawValue:NSParagraphStyle.default
]
}