encadenamiento opcional rápido con yeso

El código a continuación resalta un problema que estoy combinando encadenamiento y moldes opcionales con el lenguaje rápido de Apple

import Foundation import CoreData class MyExample { var detailItem: NSManagedObject? func example() { //In the actual implementation it is assigned to a UITableViewCell textLabel.text with the same result. let name: String = self.detailItem?.valueForKey("name") as String } } 

Lo anterior resulta en:

'AnyObject' no es convertible a 'String'

Soy capaz de hacer esto haciendo que la variable de class sea opcionalmente desenvuelta implícitamente de la siguiente manera:

 class MyExample2 { var detailItem: NSManagedObject! func example() { let name: String = self.detailItem.valueForKey("name") as String } } 

Esto funciona, pero ahora esta variable no refleja mi necesidad real de que sea opcional

Este próximo ejemplo también funciona con detailItem como opcional:

 class MyExample3 { var detailItem: NSManagedObject? func example() { let name: String = self.detailItem?.valueForKey("name").description as String } } 

El problema con lo anterior es que tuve que usar la descripción. Generalmente, no es una buena idea usar la salida de esta function para mostrarla al usuario (de acuerdo con Apple, y simplemente con sentido común)

Lo anterior también solo funciona porque estoy buscando una cadena. Si necesitaba un object, no funcionaría.

Como punto de interés, este ejemplo arroja un error diferente:

 class MyExample4 { var detailItem: NSManagedObject? func example() { let name: String = self.detailItem?.valueForKey("name") } } 

Lo anterior arroja:

No se pudo encontrar el miembro 'valueForKey'

NSmanagedObject tiene claramente un valor para key.

Intentando una cosa más, descubrí una solución potencial:

 class MyExamplePotentialSolution { var detailItem: NSManagedObject? func example() { let name: NSString = self.detailItem?.valueForKey("name") as NSString } } 

El problema con lo anterior es que no funciona cuando está realmente asignado a un atributo UITableViewCell detailTextLabel.text.

¿Algunas ideas?

Respuesta Actualizada

El uso más simple del mundo real resultó ser esto:

 cell.detailTextLabel.text = self.detailItem?.valueForKey("name") as? NSString 

La key es que AnyObject no puede lanzarse directamente a un tipo swift nativo. Como mostró la respuesta aceptada, se puede convertir como una cadena Swift nativa de NSString. Simplemente no es necesario en este caso.

Hay 2 problemas: el primero es que en esta línea:

 let name: String = self.detailItem?.valueForKey("name") as String 

la parte derecha es opcional ( detailItem es opcional), por lo que sea lo que sea que la expresión regrese, no se puede asignar a una variable no opcional que tenga el tipo String

¡El segundo problema es que valueForKey devuelve AnyObject! , que puede ser una instancia de cualquier class, pero String no es una class, necesitarías Any para poder convertir eso en una String . Supongo que NSManagedObject devuelve un NSString , por lo que puede lograr lo que necesita con esta línea:

 let name: String? = (self.detailItem?.valueForKey("name") as? NSString) as? String