2014-07-08 17 views
11

Con la beta 3 di Xcode il seguente pezzo di codice non funziona più:dizionario non riconosce il tipo di chiave

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

presso l'istruzione:

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

XCode restituire l'errore [ NSObject: AnyObject] non ha un membro denominato objectForKey.

così ho cambiato il codice come questo:

func keyboardWasShown (notification: NSNotification) 
{ 

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

} 

ma XCode restituisce l'errore "stringa non è un sottotipo f DictionaryIndex"

+1

Sembra che non sappia che userInfo è un NSDictionary. Hai provato var info = 'notification.userInfo as NSDictionary'? con il tuo primo codice – Paulw11

+0

No, l'ho provato adesso e funziona perfettamente! Grazie! Ma perché non riconosce userInfo come NSDictionary? – Andorath

risposta

18

Come di Xcode 6 Beta 3, NSDictionary* viene importato da Obiettivo -C API come [NSObject : AnyObject] (questa modifica è documentata nelle note di rilascio).

Quindi è possibile accedere al valore del dizionario con info[UIKeyboardFrameBeginUserInfoKey]. Questo dà un AnyObject cui si deve lanciare a NSValue, in modo che CGRectValue() può essere applicato:

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

Il messaggio di errore

'String' non è un sottotipo di 'DictionaryIndex'

è abbastanza fuorviante, il problema con il tuo secondo tentativo è solo il cast mancante.

Aggiornamento per Xcode 6.3:notification.userInfo è un dizionario opzionale ora e deve essere scartato, per esempio con associazione facoltativa. Anche l'operatore di cast forzata as è stato rinominato in as!:

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

Possiamo forza scartare il valore dizionario perché è documentato essere un NSValue di una CGRect.

Problemi correlati