? ' no tiene un miembro llamado error 'subíndice' en Xcode 6 beta 6

Utilicé el siguiente par de líneas de código para get el marco del keyboard cuando se muestra en la pantalla. Me he registrado en la notificación UIKeyboardDidShowNotification .

 func keyboardWasShown(notification: NSNotification) { var info = notification.userInfo var keyboardFrame: CGRect = info.objectForKey(UIKeyboardFrameEndUserInfoKey).CGRectValue() } 

Esto solía funcionar en la versión beta 5. Descargué la última versión de Xcode 6 que es beta 6 y este error ocurrió en la segunda línea.

'[NSObject: AnyObject]?' no tiene un miembro llamado 'objectForKey'

Después de search en Google, encontré esta solución. Y lo cambié como tal,

 var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue() 

Pero parece que eso también está desactualizado ahora. Porque obtengo este error ahora.

'[NSObject: AnyObject]?' no tiene un miembro llamado 'subíndice'

No puedo entender este error ni cómo resolverlo.

Como se menciona en las notas de la versión Xcode 6 beta 6, se ha auditado una gran cantidad de API de Foundation para la conformidad opcional. Estos cambios reemplazan a T! ¿con T? o T dependiendo de si el valor puede ser nulo (o no) respectivamente.

notification.userInfo ahora es un dictionary opcional :

 class NSNotification : NSObject, NSCopying, NSCoding { // ... var userInfo: [NSObject : AnyObject]? { get } // ... } 

así que tienes que desenvolverlo. Si sabe que userInfo no es nil , simplemente puede usar un "deslocking forzado":

 var info = notification.userInfo! 

pero tenga en count que esto se bloqueará en time de ejecución si userInfo es nil .

De lo contrario, mejor use una asignación opcional:

 if let info = notification.userInfo { var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() } else { // no userInfo dictionary present }