21

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()
}
Krunal
  • 77,632
  • 48
  • 245
  • 261
Fawwad Ahmed
  • 234
  • 1
  • 4
  • 12

3 Answers3

29

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.

Charles Srstka
  • 16,665
  • 3
  • 34
  • 60
5

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]?)
Tamás Sengel
  • 55,884
  • 29
  • 169
  • 223
-1

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?

Flarosa
  • 1,287
  • 1
  • 13
  • 27
  • Answers are not supposed to be used for asking questions. You should consider making a comment or asking a new question and refer to this one from there. – Paula Hasstenteufel Feb 13 '18 at 11:53