Fawwad Ahmed
Fawwad Ahmed

Reputation: 234

Cannot convert value of type '[String : AnyObject]?' to expected argument type '[NSAttributedStringKey : Any]?'

How to convert values of type '[String : AnyObject]?'to expected argument type '[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()
}

Upvotes: 21

Views: 19831

Answers (3)

Charles Srstka
Charles Srstka

Reputation: 17040

This is a new feature of Swift 4. All the Cocoa methods that take string identifiers and/or dictionary keys now have their own types for the keys. The reason for this is to add a bit of type safety—in the old regime, it was possible to accidentally pass a String constant by mistake that was meant to be used with some other API, but now in Swift 4, this will result in a compilation error.

Change your method signature to:

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

EDIT: Updated for Swift 4.2! NSAttributedStringKey has been renamed to NSAttributedString.Key.

Upvotes: 29

Flarosa
Flarosa

Reputation: 1861

This is the Charts module. I ran into the same problem.

Changing the method argument fixes the error in that method, but pushes the problem up to all the callers of that method, which now have the same issue.

Is there a quick fix that doesn't involve changing the whole call stack?

Upvotes: -1

glyvox
glyvox

Reputation: 58029

Your atrribute argument is incorrect in the drawText function.

Change

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

to

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

Upvotes: 5

Related Questions