the programming language guidelines book apple swift4

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 }