Swift 4 Cannot convert value of type '[String : AnyObject]?' to expected argument type '[NSAttributedStringKey : Any]?'

前端 未结 4 2037
悲哀的现实
悲哀的现实 2020-12-19 13:16

I have just updated to Xcode 9 and converted my app from swift 3 to swift 4. I have graphs which use strings to label the axes and other variables. So I have a moneyAxisStri

相关标签:
4条回答
  • 2020-12-19 13:40

    Try this:

    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
            ]
        }
    
    0 讨论(0)
  • 2020-12-19 13:49

    It's a type mismatch: [String : AnyObject] is clearly not [NSAttributedStringKey : Any]

    ⌥-click on NSAttributedStringKey to see the declaration.


    The solution is to declare attributes as

    var attributes = [NSAttributedStringKey : Any]()
    

    to remove the down cast

     ..., withAttributes: attributes)
    

    and to write simply

    attributes = [.foregroundColor: fieldColor,
                  .font: fieldFont!,
                  .paragraphStyle: style]
    
    0 讨论(0)
  • 2020-12-19 13:53

    NSAttributedStringKey was changed to a struct in Swift 4. However, other objects that use NSAttributedStringKey apparently didn't get updated at the same time.

    The easiest fix, without having to change any of your other code, is to append .rawValue to all your occurrences of NSAttributedStringKey setters - turning the key names into Strings:

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

    Note that you won't need the ! at the as now, either.

    Alternatively, you can skip the as cast at the end by declaring the array to be [String : Any] upfront:

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

    Of course, you still need to append the .rawValue for each NSAttributedStringKey item you set.

    0 讨论(0)
  • 2020-12-19 13:53

    Swift 4.2
    Built on example of 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
            ]
        }
    
    0 讨论(0)
提交回复
热议问题