Подтвердить что ты не робот

Словарь не распознает тип ключа

С бета-3 Xcode следующий фрагмент кода больше не работает:

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

в инструкции:

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

XCode возвращает ошибку [NSObject: AnyObject] не имеет члена с именем objectForKey.

Итак, я изменил код следующим образом:

func keyboardWasShown (notification: NSNotification)
{

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

}

но XCode возвращает ошибку "String не является подтипом f DictionaryIndex"

4b9b3361

Ответ 1

Начиная с версии Xcode 6 Beta 3, NSDictionary* теперь импортируется из Objective-C API как [NSObject : AnyObject] (это изменение задокументировано в примечаниях к выпуску).

Таким образом, вы можете получить доступ к значению словаря с помощью info[UIKeyboardFrameBeginUserInfoKey]. Это дает AnyObject, который вы должны наложить на NSValue, так что CGRectValue() можно применить:

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

Сообщение об ошибке

'String' не является подтипом словаря DictionaryIdex

довольно вводит в заблуждение, проблема с вашей второй попыткой - это только недостающий состав.

Обновление для Xcode 6.3: notification.userInfo теперь является необязательным словарем и его необходимо развернуть, например. с необязательным связыванием. Также оператор принудительного литья as был переименован в as!:

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

Мы можем принудительно развернуть значение словаря, поскольку оно документировано быть NSValue a CGRect.