2017-09-20 126 views
4

我剛剛更新到Xcode 9,並將我的應用程序從swift 3轉換爲swift 4. 我有使用字符串標記軸和其他變量的圖形。 所以我有一個moneyAxisString =「錢」。 以前我能夠使用這個代碼繪製它們:Swift 4無法轉換類型'[String:AnyObject]'的值?'到期望的參數類型'[NSAttributedStringKey:Any]?'

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

回答

6

這是一個類型不匹配:在NSAttributedStringKey[String : AnyObject]顯然不是[NSAttributedStringKey : Any]

⌥單擊看到聲明。


的解決方案是申報attributes作爲

var attributes = [NSAttributedStringKey : Any]() 

去除下來投

..., withAttributes: attributes) 

,並寫簡單

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

當我刪除downcast我得到:無法將類型'NSDictionary'的值轉換爲期望的參數類型'[NSAttributedStringKey:Any]?'然後它說:插入'as! [NSAttributedStringKey:Any]'。此外,當我縮短屬性的代碼時,它說「表達式解析爲一個未使用的l值」和「預期表達式」和「連續的語句在一行上必須用';'隔開,插入」;「。我最初定義的屬性爲:var attributes:NSDictionary = [:] –

+0

聲明'var attributes = [NSAttributedStringKey:Any]()'而不是'NSDictionary',那麼你甚至可以刪除註釋。不要在'NSDictionary'中使用無論如何Swift。 – vadian

0

試試這個:

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

NSAttributedStringKey改爲一個struct斯威夫特4.然而,其他對象使用NSAttributedStringKey顯然沒有得到在同一時間進行更新。

最簡單的修復,而無需更改任何其他代碼,是追加.rawValueNSAttributedStringKey制定者所有你的出現 - 轉動鑰匙名稱爲String S:

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項目。

相關問題