问题
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()
}
回答1:
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
.
回答2:
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]?)
回答3:
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?
来源:https://stackoverflow.com/questions/45695286/cannot-convert-value-of-type-string-anyobject-to-expected-argument-type