21

如何将类型的值转换'[String : AnyObject]?'为预期的参数类型'[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()
}
4

3 回答 3

28

这是 Swift 4 的一个新特性。所有采用字符串标识符和/或字典键的 Cocoa 方法现在都有自己的键类型。这样做的原因是为了增加一点类型安全性——在旧制度中,可能会意外String地错误地传递一个本来应该与其他 API 一起使用的常量,但现在在 Swift 4 中,这将导致编译错误。

将您的方法签名更改为:

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

编辑:为 Swift 4.2 更新!NSAttributedStringKey已重命名为NSAttributedString.Key.

于 2017-08-15T14:45:00.447 回答
5

您的atrribute论点在函数中不正确drawText

改变

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

open class func drawText(context: CGContext, text: String, point: CGPoint, align: NSTextAlignment, attributes: [NSAttributedStringKey : Any]?)
于 2017-08-15T14:45:44.213 回答
-1

这是图表模块。我遇到了同样的问题。

更改方法参数可修复该方法中的错误,但会将问题推给该方法的所有调用者,这些调用者现在有相同的问题。

是否有不涉及更改整个调用堆栈的快速修复?

于 2018-01-24T23:19:04.290 回答