swift4 - programming - Error de conversión de Swift 4-NSAttributedStringKey: Cualquiera
swift apple download (4)
¿Por qué tienes este error?
Anteriormente, sus attributes
se definen como [String: Any]
, donde la clave proviene de NSAttributedStringKey
como una cadena.
Durante la migración, el compilador intenta mantener el tipo [String: Any]
. Sin embargo, NSAttributedStringKey
convierte en una estructura en NSAttributedStringKey
4. Por lo tanto, el compilador intenta cambiar eso a cadena obteniendo su valor bruto.
En este caso, setTitleTextAttributes
está buscando [NSAttributedStringKey: Any]
pero usted proporcionó [String: Any]
Para corregir este error:
Elimine .rawValue
y .rawValue
sus attributes
como [NSAttributedStringKey: Any]
Es decir, cambiar esta línea siguiente
let attributes = [NSAttributedStringKey.font.rawValue:
UIFont(name: "Helvetica-Bold", size: 15.0)!,
NSAttributedStringKey.foregroundColor: UIColor.white] as! [String : Any]
a
let attributes = [NSAttributedStringKey.font:
UIFont(name: "Helvetica-Bold", size: 15.0)!,
NSAttributedStringKey.foregroundColor: UIColor.white] as! [NSAttributedStringKey: Any]
Convertí mi aplicación recientemente y sigo recibiendo el error
"No se puede convertir el valor del tipo ''[Cadena: Cualquiera]'' al tipo de argumento esperado ''[NSAttributedStringKey: Any]?''
barButtonItem.setTitleTextAttributes(attributes, for: .normal)
Código entero:
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
}
Como se señaló en las respuestas anteriores, NSAttributedStringKey
se cambió a una estructura en Swift 4. Sin embargo, otros objetos que usan NSAttributedStringKey
aparentemente no se actualizaron al mismo tiempo.
La solución más fácil, sin tener que cambiar ninguno de sus otros códigos, es adjuntar .rawValue
a todas sus ocurrencias de los NSAttributedStringKey
de NSAttributedStringKey
- convirtiendo los nombres de las teclas en String
s:
let attributes = [
NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
] as [String : Any]
Tenga en cuenta que no necesitará el !
en el as
ahora, tampoco.
Alternativamente, puede omitir el orden al final declarando que la matriz es [String : Any]
por adelantado:
let attributes: [String : Any] = [
NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white
]
Por supuesto, aún debe agregar el .rawValue
para cada elemento NSAttributedStringKey
que establezca.
Se espera NSAttributedStringKey
( NSAttributedStringKey.font
) y está enviando String
( NSAttributedStringKey.font.rawValue
).
Entonces, reemplace NSAttributedStringKey.font.rawValue
con NSAttributedStringKey.font
como a continuación:
let attributes = [NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 15.0)!, NSAttributedStringKey.foregroundColor: UIColor.white]
La respuesta de Leanne es correcta para los casos en los que aún necesita usar [String : Any]
y no [NSAttributedStringKey : Any]
.
Por ejemplo, en UIKit UITextView.typingAttributes
todavía es de tipo [String : Any]
. Entonces para esa propiedad tienes que usar atributos convertidos (incluyendo los personalizados):
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()
donde toTypingAttributes()
es una función definida por extensión en cualquiera de sus archivos de proyecto:
extension Dictionary where Key == NSAttributedStringKey {
func toTypingAttributes() -> [String: Any] {
var convertedDictionary = [String: Any]()
for (key, value) in self {
convertedDictionary[key.rawValue] = value
}
return convertedDictionary
}