2016-09-27 37 views
1

我正在將我的項目升級到swift 3.0,並且在userInfo [「aps」]上收到錯誤。我試圖把一個問號和感嘆號,但沒有運氣對字符串文字和NSObject下標類型下標的歧義引用

private func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 

     if let aps = userInfo["aps"] as? NSDictionary { 
      if let alert = aps["alert"] as? NSDictionary { 
       if let message = alert["message"] as? NSString { 
        //Do stuff 
       } 
      } else if let alert = aps["alert"] as? NSString { 
       //Do stuff 
      } 
     } 


    } 
+0

始終包含錯誤消息的確切文本。 – BaseZen

回答

2

與往常一樣,使用SWIFT集合類型,該基金會收藏類型不提供有關其內容的任何類型的信息。

首先使用委託方法的實際簽名,將該方法標記爲私有並保留舊簽名是一個不好的折衷。但是,請考慮該方法已被棄用。

func application(_ application: UIApplication, didReceiveRemoteNotification 
         userInfo: [AnyHashable : Any]) 

JSON集合類型總是[String:Any](字典)或[[String:Any]](數組)

func application(_ application: UIApplication, didReceiveRemoteNotification 
         userInfo: [AnyHashable : Any]) 

    if let aps = userInfo["aps"] as? [String:Any] { 
     if let alert = aps["alert"] as? [String:Any] { 
      if let message = alert["message"] as? String { 
       //Do stuff 
      } 
     } else if let alert = aps["alert"] as? String { 
      //Do stuff 
     } 
    } 
} 
-1

斯威夫特3不再自動橋樑值類型之間(String,即「APS」的類型)的Objective-C基準類型(NSString ,你的字典所需NSObject型鍵)的後代

所以你必須做到:

userInfo["aps" as NSString]

您也可以保存自己的一些麻煩^ h作爲迅速得到了休息到本地斯威夫特形式可能:AVING重複這種橋接技術

if let aps = userInfo["aps" as NSString] as? [String: AnyObject] { 
    if let alert = aps["alert"] as? [String: String], message = alert["message"] { 
     // message is now a Swift String 
    } 
    else if let alert = aps["alert"] as? String { 
     // alert is now a Swift String 
    } 
} 
+1

在Swift 3中將字符串連接到'NSString'的建議非常糟糕。在Swift 3中考慮關鍵的變化'AnyObject' - >'Any'和'[NSObject:AnyObject]' - >'[AnyHashable:Any]' – vadian

相關問題