Search code examples
swift4xcode9

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


I have just updated to Xcode 9 and converted my app from swift 3 to swift 4. I have graphs which use strings to label the axes and other variables. So I have a moneyAxisString = "Money". Previously I was able to draw them using this 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])

Where attributes is a dictionary defined as follows

 attributes = [
        NSAttributedStringKey.foregroundColor: fieldColor,
        NSAttributedStringKey.font: fieldFont!,
        NSAttributedStringKey.paragraphStyle: style

    ]

Now my app won't compile and I am getting the message:

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


Solution

  • It's a type mismatch: [String : AnyObject] is clearly not [NSAttributedStringKey : Any]

    ⌥-click on NSAttributedStringKey to see the declaration.


    The solution is to declare attributes as

    var attributes = [NSAttributedStringKey : Any]()
    

    to remove the down cast

     ..., withAttributes: attributes)
    

    and to write simply

    attributes = [.foregroundColor: fieldColor,
                  .font: fieldFont!,
                  .paragraphStyle: style]