簡體   English   中英

下標用法模棱兩可?

[英]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集合類型,因為NSArrayNSDictionary確實是類型無關的,因此可以輕松觸發“模棱兩可的使用”錯誤。

您還希望避免強制向下廣播,以防接收格式錯誤的數據或根本沒有數據。 為了防止撞車,這種情況將由guard更好地處理。 如果您的程序依賴於強制向下轉換的成功,因此應該崩潰–那么您可以隨時在防護中調用fatalError並提供描述性錯誤消息,以幫助您調試問題。

如果我正確理解了您的數據結構,則請求將返回一個AnyObject ,該對象應為[String:AnyObject] (任何對象的字符串字典)。 如果使用"data"鍵,則AnyObjectAnyObject [[String:AnyObject]] (任何對象的字符串字典的數組)。

因此,您需要分兩個階段進行轉換。 首先,對result使用條件[String:AnyObject]將其[String:AnyObject]轉換為[String:AnyObject] 如果失敗,則將執行保護的else子句,並返回代碼。 然后,您將希望獲取"data"值(您的“喜歡”數組),並有條件地將其轉換為[[String:AnyObject]] 這兩個語句都將處理resultDictresultDict["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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM