2014-07-08 15 views
11

Z beta 3 z Xcode następujący fragment kodu już nie działa:słownik nie rozpoznaje klucza typ

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

na zlecenie:

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

XCode powrotu błędu [ NSObject: AnyObject] nie ma członka o nazwie objectForKey.

więc zmieniłem kod tak:

func keyboardWasShown (notification: NSNotification) 
{ 

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

} 

ale XCode zwraca błąd "String nie jest podtypem f DictionaryIndex"

+1

Wygląda na to, że nie wie, że userInfo jest NSDictionary. Czy próbowałeś var info = 'notification.userInfo jako NSDictionary'? z twoim pierwszym kodem – Paulw11

+0

Nie, próbowałem go już teraz i działa idealnie! Dziękuję Ci! Ale dlaczego nie rozpoznaje userInfo, takiego jak NSDictionary? – Andorath

Odpowiedz

18

Od Xcode 6 Beta 3, NSDictionary* jest teraz importowany z Objective -C API jako [NSObject : AnyObject] (ta zmiana jest udokumentowana w informacjach o wersji).

Dzięki temu można uzyskać dostęp do wartości słownika za pomocą info[UIKeyboardFrameBeginUserInfoKey]. Daje to AnyObject której trzeba oddać do NSValue, tak że CGRectValue() mogą być stosowane:

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

Błąd wiadomość

'String' nie jest podtypem 'DictionaryIndex'

jest dość myląca, problem z drugą próbą to tylko brakująca obsada.

Aktualizacja Xcode 6.3:notification.userInfo jest opcjonalnie słownik się i musi być rozpakowywany, np z opcjonalnym wiązaniem. Również operator zmuszony obsada as została zmieniona na as!:

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

Możemy mocno odwinąć wartość słownika, ponieważ jest udokumentowane być NSValue z CGRect.

Powiązane problemy