2014-07-08 55 views
11

隨着測試的Xcode 3以下的代碼塊不工作了:字典不識別密鑰類型

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中返回錯誤「字符串不是亞型˚FDictionaryIndex」

+1

它似乎並不知道userInfo是一個NSDictionary。你有沒有嘗試過var info ='notification.userInfo as NSDictionary'?與您的第一個代碼 – Paulw11

+0

不,我已經嘗試過它,它完美的作品!謝謝!但爲什麼它不認可像NSDictionary userInfo? – Andorath

回答

18

作爲Xcode的6β3的,NSDictionary*現在從目的進口-C API爲[NSObject : AnyObject](此更改記錄在發行說明中)。

因此,您可以使用info[UIKeyboardFrameBeginUserInfoKey]訪問字典值。 這給出了一個AnyObject你必須轉換爲NSValue,以便CGRectValue()可應用於:

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

該錯誤消息

「字符串」不是「DictionaryIndex」

亞型

是相當誤導,您的第二次嘗試的問題只是失蹤的演員。

更新的Xcode 6.3:notification.userInfo可選字典現在,必須解開,例如與可選的綁定。 還強制類型轉換操作符as已更名爲as!

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

我們可以強行解開字典價值,因爲它是記錄 是一個CGRectNSValue