Le dictionary ne reconnaît pas le type de key

Avec la beta 3 de Xcode, le code suivant ne fonctionne plus:

func keyboardWasShown (notification: NSNotification) { var info = notification.userInfo keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey).CGRectValue().size } 

à l'instruction:

 keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey).CGRectValue().size 

XCode renvoie l'erreur [NSObject: AnyObject] n'a pas de membre nommé objectForKey.

J'ai donc changé le code comme ceci:

 func keyboardWasShown (notification: NSNotification) { var info = notification.userInfo keyboardSize = info[UIKeyboardFrameBeginUserInfoKey].CGRectValue().size } 

mais XCode renvoie l'erreur "La string n'est pas un sous-type f DictionaryIndex"

À partir de Xcode 6 Beta 3, NSDictionary* est maintenant importé à partir des API Objective-C en tant que [NSObject : AnyObject] (ce changement est documenté dans les notes de publication).

Vous pouvez donc accéder à la valeur du dictionary avec info[UIKeyboardFrameBeginUserInfoKey] . Cela donne un AnyObject que vous devez NSValue en NSValue , de sorte que CGRectValue() peut être appliqué:

 var info = notification.userInfo let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as NSValue).CGRectValue().size 

Le message d'erreur

'Ssortingng' n'est pas un sous-type de 'DictionaryIndex'

est assez trompeur, le problème avec votre deuxième tentative est seulement la dissortingbution manquante.

Mise à jour pour Xcode 6.3: notification.userInfo est maintenant un dictionary optionnel et doit être déballé, par exemple avec une binding optionnelle. Aussi l'opérateur de casting forcé a été renommé en as! :

 if let info = notification.userInfo { let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue().size } else { // no user info } 

Nous pouvons NSValue de la valeur du dictionary car il est documenté pour être un NSValue d'un CGRect .