[英]Ambiguous use of subscript?
我可以發出Facebook SDK Graph請求來獲得用戶的喜歡,但是我在獲取返回值並將鍵之一存儲在字符串數組中時遇到了麻煩。 該請求返回鍵/值的NSDictionary。 然后,使用objectForKey
我可以獲取返回我想要的data
密鑰:Facebook上“喜歡”頁面的ID和名稱。
數據返回如下元素:
{
id = 486379781543416;
name = "Star Wars Movies";
},
我專門只希望所有這些對象的“名稱”並將它們放入數組[String]
。 我試圖遍歷對象,但是ambiguous use of subscript
出現錯誤ambiguous use of subscript
。 以下是相關代碼:
request.startWithCompletionHandler{(connection:FBSDKGraphRequestConnection!, result:AnyObject!, error:NSError!) -> Void in
let resultdict = result as! NSDictionary
let likes = resultdict.objectForKey("data") as! NSArray
print("Found \(likes.count) likes")
print(likes)
for object in likes{
let name = object["name"] as! String //error: ambiguous use of subsript
print(name)
}
}
經過一些研究后,看起來好像是NSArray存在問題,我應該改用Swift數據類型。 我嘗試將其強制轉換為Swift數組,但遇到了不同的錯誤。
處理此錯誤的最佳方法是什么?
謝謝!
更新:這是facebook API請求返回的內容:
{
data = (
{
id = 111276025563005;
name = "Star Wars (film)";
},
{
id = 115061321839188;
name = "Return of the Jedi";
}
);
paging = {
cursors = {
after = MTE1MDYxMzIxODM5MTg4;
before = Mjc0NzYzODk2MTg4NjY5;
};
next = "https://graph.facebook.com/v2.5/10155262562690368/likes?access_token=<redacted>";
};
}
您應該始終盡可能使用本機Swift集合類型,因為NSArray
和NSDictionary
確實是類型無關的,因此可以輕松觸發“模棱兩可的使用”錯誤。
您還希望避免強制向下廣播,以防接收格式錯誤的數據或根本沒有數據。 為了防止撞車,這種情況將由guard
更好地處理。 如果您的程序依賴於強制向下轉換的成功,因此應該崩潰–那么您可以隨時在防護中調用fatalError
並提供描述性錯誤消息,以幫助您調試問題。
如果我正確理解了您的數據結構,則請求將返回一個AnyObject
,該對象應為[String:AnyObject]
(任何對象的字符串字典)。 如果使用"data"
鍵,則AnyObject
值AnyObject
[[String:AnyObject]]
(任何對象的字符串字典的數組)。
因此,您需要分兩個階段進行轉換。 首先,對result
使用條件[String:AnyObject]
將其[String:AnyObject]
轉換為[String:AnyObject]
。 如果失敗,則將執行保護的else子句,並返回代碼。 然后,您將希望獲取"data"
值(您的“喜歡”數組),並有條件地將其轉換為[[String:AnyObject]]
。 這兩個語句都將處理resultDict
或resultDict["data"]
為nil
的可能性。
guard let resultDict = result as? [String:AnyObject] else {return}
guard let likes = resultDict["data"] as? [[String:AnyObject]] else {return}
您可以將所需的任何錯誤處理邏輯放在這些語句的括號中,以處理結果字典不存在,格式錯誤或其中沒有“喜歡”數組的情況。
然后,您可以使用flatMap
獲得一個“喜歡”名稱的數組。
let likeNames = likes.flatMap{$0["name"] as? String}
這將創建一個由每個字典的相似名稱組成的數組–如果相似名稱不存在或不是字符串,則不會添加它們。 因為編譯器肯定知道likes
是[[String:AnyObject]]
–在其元素下標沒有任何歧義。
如果您想要一個更通用的方法(例如您在問題中所做的事情),則可以在for循環中使用guard語句。
for object in likes {
guard let name = object["name"] as? String else {continue}
print(name)
}
同樣,您可以將所需的任何錯誤處理放入防護罩中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.