[NSObject: AnyObject]? "не имеет члена с именем" индекс" в Xcode 6 beta 6

Я использовал пару строк кода, чтобы получить рамку клавиатуры, когда она отображается на экране. Я зарегистрировался в уведомлении UIKeyboardDidShowNotification.

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

Это работало в бета-версии 5. Я загрузил последнюю версию Xcode 6, которая является бета-версией 6, и эта ошибка произошла во второй строке.

'[NSObject: AnyObject]?' не имеет члена с именем 'objectForKey'

После некоторого Googling я столкнулся с этим решением. И я изменил его так,

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

Но, похоже, это тоже устарело. Потому что я получаю эту ошибку сейчас.

'[NSObject: AnyObject]?' не имеет члена с именем 'subscript'

Я не могу понять эту ошибку или как ее решить.

Ответ 1

Как упоминалось в примечаниях к выпуску Xcode 6 beta 6, большое количество API-интерфейсов Foundation проверено для дополнительного соответствия. Эти изменения заменяют T! на T? или T в зависимости от того, может ли значение быть нулевым (или нет) соответственно.

notification.userInfo теперь является необязательным словарем:

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

поэтому вам нужно развернуть его. Если вы знаете, что userInfo не nil, тогда вы можете просто использовать "принудительное разворачивание":

var info = notification.userInfo!

но обратите внимание, что это приведет к сбою во время выполнения, если userInfo - nil.

В противном случае лучше использовать необязательное назначение:

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