web-dev-qa-db-ja.com

Swift 4変換エラー-NSAttributedStringKey:Any

最近アプリを変換しましたが、エラーが発生し続けます

「タイプ '[String:Any]'の値を期待される引数タイプ '[NSAttributedStringKey:Any]に変換できませんか?」

barButtonItem.setTitleTextAttributes(attributes, for: .normal)

コード全体:

 class func getBarButtonItem(title:String) -> UIBarButtonItem {
    let barButtonItem = UIBarButtonItem.init(title: title, style: .plain, target: nil, action: nil)
    let attributes = [NSAttributedStringKey.font.rawValue:  UIFont(name: "Helvetica-Bold", size: 15.0)!, NSAttributedStringKey.foregroundColor: UIColor.white] as! [String : Any]
    barButtonItem.setTitleTextAttributes(attributes, for: .normal)

    return barButtonItem
}
29
Eazy

このエラーが発生した理由

以前は、attributes[String: Any]として定義され、キーはNSAttributedStringKeyから文字列として、またはSwiftのNSAttributedString.Keyから取得されます4.2

移行中、コンパイラは[String: Any]タイプを保持しようとします。ただし、NSAttributedStringKeyはSwift 4の構造体になります。したがって、コンパイラーは、未加工の値を取得することで、文字列に変更しようとします。

この場合、setTitleTextAttributes[NSAttributedStringKey: Any]を探していますが、[String: Any]を指定しました

このエラーを修正するには:

.rawValueを削除し、attributes[NSAttributedStringKey: Any]としてキャストします

つまり、次の行を変更します

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

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

Swift 4.2では、

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

NSAttributedStringKeyNSAttributedStringKey.font)を期待しており、StringNSAttributedStringKey.font.rawValue)を送信しています。

以下のようにNSAttributedStringKey.font.rawValueNSAttributedStringKey.fontに置き換えてください:

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

前の回答で述べたように、NSAttributedStringKeyはSwift 4の構造体に変更されました。ただし、useNSAttributedStringKeyは明らかに同時に更新されませんでした。

他のコードを変更することなく、最も簡単な修正方法は、append.rawValue toallNSAttributedStringKeyセッターの出現-キー名をStringsに変換:

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

asにある!も今は必要ないことに注意してください。

または、配列を[String : Any]であると宣言することで、最後にasキャストをスキップできます:

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

もちろん、設定したNSAttributedStringKeyアイテムごとに.rawValueを追加する必要があります。

5
leanne

leanneの答え は、[String : Any]ではなく[NSAttributedStringKey : Any]を使用する必要がある場合に適しています。

たとえば、UIKitではUITextView.typingAttributesは依然として[String : Any]型です。そのため、そのプロパティには、変換された属性(カスタム属性を含む)を使用する必要があります。

let customAttributeName = "MyCustomAttributeName"
let customValue: CGFloat = 15.0

let normalTextAttributes: [NSAttributedStringKey : Any] =
            [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 14.0),
             NSAttributedStringKey.foregroundColor : UIColor.blue,
             NSAttributedStringKey.backgroundColor : UIColor.clear,
             NSAttributedStringKey(rawValue: customAttributeName): customValue]

textView.typingAttributes = normalTextAttributes.toTypingAttributes()

toTypingAttributes()は、プロジェクトファイルの拡張子によって定義された関数です。

extension Dictionary where Key == NSAttributedStringKey {
    func toTypingAttributes() -> [String: Any] {
        var convertedDictionary = [String: Any]()

        for (key, value) in self {
            convertedDictionary[key.rawValue] = value
        }

        return convertedDictionary
}
2
roxanneM