[英]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.