无法转换类型“[String : AnyObject]?”的值到预期的参数类型“[NSAttributedStringKey:Any]?”

Posted

技术标签:

【中文标题】无法转换类型“[String : AnyObject]?”的值到预期的参数类型“[NSAttributedStringKey:Any]?”【英文标题】:Cannot convert value of type '[String : AnyObject]?' to expected argument type '[NSAttributedStringKey : Any]?' 【发布时间】:2017-08-15 14:42:50 【问题描述】:

如何将'[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 方法现在都有自己的键类型。这样做的原因是为了增加一点类型安全性——在旧制度中,可能会意外地传递一个本来应该与其他 API 一起使用的 String 常量,但现在在 Swift 4 中,这将导致编译错误。

将您的方法签名更改为:

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

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

【讨论】:

感谢您的帮助:)【参考方案2】:

drawText 函数中的 atrribute 参数不正确。

改变

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】:

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

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

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

【讨论】:

答案不应该用于提问。您应该考虑发表评论或提出新问题,然后从那里参考这个问题。

以上是关于无法转换类型“[String : AnyObject]?”的值到预期的参数类型“[NSAttributedStringKey:Any]?”的主要内容,如果未能解决你的问题,请参考以下文章

SWIG 无法正确转换 typedef 类型

无法转换“Foo!”类型的值到预期的参数类型'Foo!'

无法将类型“()”的值转换为预期的参数类型“字符串”

无法将类型为“System.Collections.Generic.List`1[EPMS.Domain.SingleItem]”的对象强制转换为类型“EPMS

无法转换类型的值'(数据:CMAccelerometerData!,错误:NSError!)

无法将 [Struct] 类型的值快速转换为 [string] 类型