2015-11-03 55 views
4

此行let userInfo = notification.userInfo as! NSDictionary我得到一個警告:Cast from '[NSObject : AnyObject]?' to unrelated type 'NSDictionary' always fails從'[NSObject:AnyObject]中投射?'無關型「的NSDictionary」總是失敗

我嘗試使用let userInfo = notification.userInfo as! Dictionary<NSObject: AnyObject>取代let userInfo = notification.userInfo as! NSDictionary。但是我收到一個錯誤:Expected '>' to complete generic argument list。如何解決警告。

的Xcode 7.1 OS X約塞米蒂

這是我的代碼:

func keyboardWillShow(notification: NSNotification) { 

    let userInfo = notification.userInfo as! NSDictionary //warning 

    let keyboardBounds = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() 
    let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue 
    let keyboardBoundsRect = self.view.convertRect(keyboardBounds, toView: nil) 

    let keyboardInputViewFrame = self.finishView!.frame 

    let deltaY = keyboardBoundsRect.size.height 

    let animations: (()->Void) = { 

     self.finishView?.transform = CGAffineTransformMakeTranslation(0, -deltaY) 
    } 

    if duration > 0 { 



    } else { 

     animations() 
    } 


} 
+0

只使用Swift原生字典 –

+0

我嘗試使用'let userInfo = notification.userInfo as! Dictionary '但它是錯誤的,我得到一個錯誤。 – rose

+0

爲什麼要輸入鑄件? – vadian

回答

4

NSNotification的USERINFO財產已經被定義爲(N可選)字典。

所以,你根本不需要施放它,只需解開它即可。

func keyboardWillShow(notification: NSNotification) { 
    if let userInfo = notification.userInfo { 
     ... 
    } 
} 

所有其餘的代碼應該按原樣工作。

+0

解開包裝是作者需要從中取出的主要東西;你不能將'[NSObject:AnyObject]?'轉換爲'NSDictionary',因爲前者是可選的,而後者不是。你可以轉換成'NSDictionary?',或者你可以解開並轉換成'NSDictionary'。但是,正如你所說的,在實踐中你只需要解包,然後你就可以直接使用它,而不需要回到Objective-C類型。 – Tommy

+0

我明白了。這是你的不同種類。 – rose

+0

我已經學會了。 – rose

3

您試圖強制將可選屬性強制轉換爲NSDictionary。試試:

let userInfo = notification.userInfo! as NSDictionary 

這對我有效。

+0

我試過了。這也沒關係。我認爲特里斯坦伯恩賽德的答案更合理。 – rose

相關問題