Swift 4无法转换类型' [String:AnyObject]的值?'预期的参数类型' [NSAttributedStringKey:Any]?'

时间:2017-09-20 13:11:25

标签: swift4 xcode9

我刚刚更新到Xcode 9并将我的应用程序从swift 3转换为swift 4。 我有图表使用字符串来标记轴和其他变量。 所以我有钱AxisString =" Money"。 以前我可以使用以下代码绘制它们:

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]?'

4 个答案:

答案 0 :(得分:10)

这是类型不匹配:[String : AnyObject]显然不是[NSAttributedStringKey : Any]

NSAttributedStringKey点击查看声明。

解决方案是将attributes声明为

var attributes = [NSAttributedStringKey : Any]()

删除向下投射

 ..., withAttributes: attributes)

并简单地写

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

答案 1 :(得分:2)

NSAttributedStringKey已更改为Swift 4中的结构。但是,使用 NSAttributedStringKey的其他对象显然没有同时更新。

最简单的修复,无需更改任何其他代码追加 .rawValue 所有您的出现次数 NSAttributedStringKey制定者 - 将关键名称转换为String s:

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

请注意,您现在也不需要!的{​​{1}}。

或者,您可以通过在前面声明数组为as来跳过最后的as强制转换:

[String : Any]

当然,您仍然需要为您设置的每个let attributes: [String : Any] = [ NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!, NSAttributedStringKey.foregroundColor.rawValue: UIColor.white ] 项附加.rawValue

答案 2 :(得分:1)

试试这个:

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

或:

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

答案 3 :(得分:0)

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