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

Я только что обновился до Xcode 9 и преобразовал свое приложение из Swift 3 в Swift 4. У меня есть графики, которые используют строки для маркировки осей и других переменных. Итак, у меня есть moneyAxisString = «Деньги». Раньше я мог рисовать их, используя этот код:

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])

Где атрибуты - это словарь, определенный следующим образом

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

    ]

Теперь мое приложение не будет компилироваться, и я получаю сообщение:

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


person Steblo    schedule 20.09.2017    source источник


Ответы (4)


Это несоответствие типов: [String : AnyObject] явно не [NSAttributedStringKey : Any]

щелкните ⌥⌥ на NSAttributedStringKey, чтобы увидеть объявление.


Решение состоит в том, чтобы объявить attributes как

var attributes = [NSAttributedStringKey : Any]()

убрать приведение вниз

 ..., withAttributes: attributes)

и писать просто

attributes = [.foregroundColor: fieldColor,
              .font: fieldFont!,
              .paragraphStyle: style]
person vadian    schedule 20.09.2017
comment
Когда я удаляю понижение, я получаю: Невозможно преобразовать значение типа «NSDictionary» в ожидаемый тип аргумента «[NSAttributedStringKey: Any]?» и затем он говорит: Вставьте 'как! [NSAttributedStringKey: Any]' . Кроме того, когда я сокращаю код для атрибутов, он говорит, что выражение разрешается в неиспользуемое l-значение, а ожидаемое выражение и последовательные операторы в строке должны быть разделены знаком «;». Вставлять ;. Уместно ли, что я изначально определил атрибуты как: атрибуты var: NSDictionary = [:] - person Steblo; 20.09.2017
comment
Объявите var attributes = [NSAttributedStringKey : Any](), а не NSDictionary, тогда вы даже можете удалить аннотацию. В любом случае не используйте NSDictionary в Swift. - person vadian; 20.09.2017

NSAttributedStringKey был изменен на структуру в Swift 4. Однако другие объекты, которые используют NSAttributedStringKey, по-видимому, не обновлялись одновременно.

Самое простое исправление, без изменения какого-либо другого кода, – это добавить .rawValue ко всем вхождениям NSAttributedStringKey сеттеров, повернув ключ имена в Strings:

let attributes = [
    NSAttributedStringKey.font.rawValue:  UIFont(name: "Helvetica-Bold", size: 15.0)!,
    NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
] as [String : Any]

Обратите внимание, что теперь вам также не понадобится ! на as.

Кроме того, вы можете пропустить приведение as в конце, объявив массив как [String : Any] заранее:

let attributes: [String : Any] = [
    NSAttributedStringKey.font.rawValue:  UIFont(name: "Helvetica-Bold", size: 15.0)!,
    NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
]

Конечно, вам все равно нужно добавить .rawValue для каждого элемента NSAttributedStringKey, который вы установили.

person leanne    schedule 14.11.2017

Попробуй это:

class func getCustomStringStyle() -> [NSAttributedStringKey: Any]
    {
        return [
            NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue): UIFont.systemFont(ofSize: 16), // or your fieldFont
            NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue): UIColor.black, // or your fieldColor
            NSAttributedStringKey(rawValue: NSAttributedStringKey.paragraphStyle.rawValue): NSParagraphStyle.default // or your style
        ]
    }

or:

class func getCustomStringStyle() -> [String: Any]
    {
        return [
            NSAttributedStringKey.font.rawValue: UIFont.systemFont(ofSize: 16),
            NSAttributedStringKey.foregroundColor.rawValue: UIColor.black,
            NSAttributedStringKey.paragraphStyle.rawValue:NSParagraphStyle.default
        ]
    }
person user_Dennis_Mostajo    schedule 25.10.2017

Swift 4.2
Создан на примере user_Dennis.

 func getCustomStringStyle() -> [NSAttributedString.Key: Any]
    {
        return [
            NSAttributedString.Key(rawValue: NSAttributedString.Key.font.rawValue): UIFont.systemFont(ofSize: 25), // or your fieldFont
            NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.black, // or your fieldColor
            NSAttributedString.Key(rawValue: NSAttributedString.Key.paragraphStyle.rawValue): NSParagraphStyle.default // or your style
        ]
    }
person bibscy    schedule 07.06.2019