web-dev-qa-db-ja.com

[NSObject:AnyObject]? ' Xcode 6ベータ6には 'subscript'エラーという名前のメンバーはありません

画面に表示されているキーボードのフレームを取得するために、以下のコード行を使用しました。 UIKeyboardDidShowNotification通知に登録しました。

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

これはベータ5で動作していました。ベータ6である最新のXcode 6バージョンをダウンロードしました。このエラーは2行目で発生しました。

'[NSObject:AnyObject]?' 「objectForKey」という名前のメンバーがありません

いくつかのグーグルの後、私は this ソリューションに出会いました。そして、私はそれをそのように変えました、

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

しかし、それも今では時代遅れになっています。私は今このエラーを受け取ったからです。

'[NSObject:AnyObject]?' 'subscript'という名前のメンバーがありません

このエラーまたはその解決方法がわかりません。

24
Isuru

Xcode 6ベータ6リリースノートで述べたように、多数のFoundation APIがオプションの適合性について監査されています。これらの変更により、T! どちらかと T?またはTは、それぞれ値がnull(またはそうでない)である可能性があるかどうかによって異なります。

notification.userInfoオプション辞書になりました:

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

だからあなたはそれを解く必要があります。 knowuserInfonilではない場合、「強制的なアンラッピング」を使用できます。

var info = notification.userInfo!

ただし、userInfonilの場合、実行時にクラッシュすることに注意してください。

それ以外の場合は、オプションの割り当てを使用する方が適切です。

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