web-dev-qa-db-fra.com

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

Comment convertir des valeurs de type '[String : AnyObject]?'au type d'argument attendu '[NSAttributedStringKey : Any]?'?

open class func drawText(context: CGContext, text: String, point: CGPoint, 
align: NSTextAlignment, attributes: [String : AnyObject]?)
{
    var point = point

    if align == .center
    {
        point.x -= text.size(withAttributes: attributes).width / 2.0
    }
    else if align == .right
    {
        point.x -= text.size(withAttributes: attributes).width
    }

    NSUIGraphicsPushContext(context)

    (text as NSString).draw(at: point, withAttributes: attributes)

    NSUIGraphicsPopContext()
}
20
Fawwad Ahmed

Il s'agit d'une nouvelle fonctionnalité de Swift 4. Toutes les méthodes Cocoa qui prennent des identificateurs de chaîne et/ou des clés de dictionnaire ont maintenant leurs propres types pour les clés. La raison en est d'ajouter un peu de sécurité de type: dans l'ancien régime, il était possible de passer accidentellement une constante String par erreur qui devait être utilisée avec une autre API, mais maintenant dans Swift 4, cela entraînera une erreur de compilation.

Modifiez la signature de votre méthode en:

open class func drawText(context: CGContext, text: String, point: CGPoint,
    align: NSTextAlignment, attributes: [NSAttributedString.Key : Any]?)

EDIT: Mis à jour pour Swift 4.2! NSAttributedStringKey a été renommé NSAttributedString.Key.

28
Charles Srstka

Votre argument atrribute est incorrect dans la fonction drawText.

Changement

open class func drawText(context: CGContext, text: String, point: CGPoint, align: NSTextAlignment, attributes: [String : AnyObject]?)

à

open class func drawText(context: CGContext, text: String, point: CGPoint, align: NSTextAlignment, attributes: [NSAttributedStringKey : Any]?)
5
Tamás Sengel