Невозможно преобразовать значение типа '[String: AnyObject]?' к ожидаемому типу аргументов '[NSAttributedStringKey: Any]?'

Как преобразовать значения типа '[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()
}

Ответ 1

Это новая функция Swift 4. Все методы Cocoa, которые принимают строковые идентификаторы и/или словарные ключи, теперь имеют свои собственные типы для ключей. Причина этого заключается в том, чтобы добавить немного безопасности типа - в старый режим, можно было случайно передать константу String по ошибке, которая должна была использоваться с каким-то другим API, но теперь в Swift 4 это будет приводят к ошибке компиляции.

Измените свою подпись метода на:

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

Ответ 2

Ваш аргумент 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]?)

Ответ 3

Это модуль диаграмм. Я столкнулся с той же проблемой.

Изменение аргумента метода устраняет ошибку в этом методе, но вызывает проблему до всех вызывающих элементов этого метода, которые теперь имеют одинаковую проблему.

Есть ли быстрое исправление, которое не связано с изменением всего стека вызовов?