最近アプリを変換しましたが、エラーが発生し続けます
「タイプ '[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
}
以前は、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]
NSAttributedStringKey
(NSAttributedStringKey.font
)を期待しており、String
(NSAttributedStringKey.font.rawValue
)を送信しています。
以下のようにNSAttributedStringKey.font.rawValue
をNSAttributedStringKey.font
に置き換えてください:
let attributes = [NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 15.0)!, NSAttributedStringKey.foregroundColor: UIColor.white]
前の回答で述べたように、NSAttributedStringKey
はSwift 4の構造体に変更されました。ただし、useNSAttributedStringKey
は明らかに同時に更新されませんでした。
他のコードを変更することなく、最も簡単な修正方法は、append.rawValue
toallNSAttributedStringKey
セッターの出現-キー名をString
sに変換:
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
を追加する必要があります。
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
}