web-dev-qa-db-fra.com

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

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]?'

5
Steve Harris

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]
10
vadian

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 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 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.

2
leanne

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
        ]
    }
1