Невозможно преобразовать значение типа "[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()
}

person Fawwad Ahmed    schedule 15.08.2017    source источник


Ответы (3)


Это новая функция Swift 4. Все методы Какао, которые принимают строковые идентификаторы и / или словарные ключи, теперь имеют свои собственные типы ключей. Причина этого заключается в том, чтобы добавить немного безопасности типов - в старом режиме можно было случайно передать 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.

person Charles Srstka    schedule 15.08.2017
comment
Спасибо за вашу помощь :) - person Fawwad Ahmed; 15.08.2017

Ваш atrribute аргумент неверен в функции drawText.

Изменять

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]?)
person Tamás Sengel    schedule 15.08.2017

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

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

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

person Flarosa    schedule 24.01.2018
comment
Ответы не должны использоваться для того, чтобы задавать вопросы. Вам следует подумать о том, чтобы оставить комментарий или задать новый вопрос и оттуда обратиться к этому. - person Paula Hasstenteufel; 13.02.2018