Arrays 类型';任何';在Swift中没有下标成员
我为标题道歉。我理解这是Swift中的常见问题。我读了其他线程中的答案,我相信我离解决这个问题有点近了 我有一个字典数组Arrays 类型';任何';在Swift中没有下标成员,arrays,swift,dictionary,Arrays,Swift,Dictionary,我为标题道歉。我理解这是Swift中的常见问题。我读了其他线程中的答案,我相信我离解决这个问题有点近了 我有一个字典数组var userObjects:[[String:AnyObject]]=[] 我用它来填充collectionview。在我的cellForItemAt函数中,我有 guard let user = userObjects[indexPath.row]["data"] as? [String:AnyObject] else { return cell } guard let
var userObjects:[[String:AnyObject]]=[]
我用它来填充collectionview。在我的cellForItemAt函数中,我有
guard let user = userObjects[indexPath.row]["data"] as? [String:AnyObject] else { return cell }
guard let firstName = user["first_name"] else {return cell}
我在上面代码段的第二行中得到了典型的类型“Any”没有下标成员的错误,直到我添加了as?[字符串:AnyObject]
到代码段的第一行。现在的问题是,user
的第一个guard语句出现代码中断,就好像该语句不正确一样
我做错了什么,如何正确地投射对象
userObjects
中元素的外观示例:
{
count = 1;
data = (
{
email = "tester2@test.com";
"first_name" = Tester;
gender = Male;
instagram = "n/a";
"last_name" = One;
preference = Female;
profileImageURL = "n/a";
}
);
page = 0;
pageCount = 1;
perPage = 20;
您必须将userObjects[indexath.row]
转换为Dictionary
let userData = userObjects[indexPath.row] as? [String:Any]
guard let user = userData?["data"] as? [String:Any] else { return cell }
guard let firstName = user["first_name"] else {return cell}
您必须将userObjects[indexath.row]
转换为Dictionary
let userData = userObjects[indexPath.row] as? [String:Any]
guard let user = userData?["data"] as? [String:Any] else { return cell }
guard let firstName = user["first_name"] else {return cell}
当你说
guard let user = userObjects[indexPath.row]["data"] as? [String:AnyObject] else { return cell }
…您是说用户
是的“数据”
条目:
data = (
{
email = "tester2@test.com";
"first_name" = Tester;
gender = Male;
instagram = "n/a";
"last_name" = One;
preference = Female;
profileImageURL = "n/a";
}
);
那不是字典。这是一系列字典。因此,尝试将其下标为“first\u name”
失败
guard let user = userObjects[indexPath.row]["data"] as? [String:AnyObject] else { return cell }
…您是说用户
是的“数据”
条目:
data = (
{
email = "tester2@test.com";
"first_name" = Tester;
gender = Male;
instagram = "n/a";
"last_name" = One;
preference = Female;
profileImageURL = "n/a";
}
);
那不是字典。这是一系列字典。因此,尝试用“first\u name”为其下标失败。根据用户数据,数据是一个键值对数组,因此首先必须从字典中获取数据,然后需要从数据(字典数组)中获取对象,如下所示:
您可以为[[String:AnyObject]]类型的值下标:-
guard let user = userObjects["data"][indexPath.row] as? [String:AnyObject] else { return cell }
guard let firstName = user["first_name"] else {return cell}
根据用户数据,数据是一个键值对数组,因此首先必须从字典中获取数据,然后需要从数据(字典数组)中获取对象,如下所示:
您可以为[[String:AnyObject]]类型的值下标:-
guard let user = userObjects["data"][indexPath.row] as? [String:AnyObject] else { return cell }
guard let firstName = user["first_name"] else {return cell}
你是对的!谢谢你向我指出这一点。那么,如果我将我的对象定义为userObjects[indexPath.row][“data”]as?[[String:AnyObject]]
,如何为[[String:AnyObject]]]
类型的值下标?您想要哪一个?如果是第一个,则为[0]
。这是一个数组,就是这样!谢谢你,马特!最终的解决方案是guard let user=userObjects[indexath.row][“data”]as?[[String:AnyObject]]else{return cell}
然后使用guard let firstName=user[0][“first_name”]else{return cell}
获取一个值,这很好,但是说了这么多之后,您所做的似乎并不迅速。这些数据来自哪里?也就是说,您从哪里获得了userObjects
?在我看来,你应该把它解析成Swift对象,这样你就不需要像任何对象那样的非类型化的东西了。我从algolia和firebase那里得到数据。我将用户信息存储在firebase中,使用algolia运行搜索查询,然后在客户端返回搜索结果。这肯定不理想,但在Firebase Firestore支持GeoQueries之前,这是必要的。你是对的!谢谢你向我指出这一点。那么,如果我将我的对象定义为userObjects[indexPath.row][“data”]as?[[String:AnyObject]]
,如何为[[String:AnyObject]]]
类型的值下标?您想要哪一个?如果是第一个,则为[0]
。这是一个数组,就是这样!谢谢你,马特!最终的解决方案是guard let user=userObjects[indexath.row][“data”]as?[[String:AnyObject]]else{return cell}
然后使用guard let firstName=user[0][“first_name”]else{return cell}
获取一个值,这很好,但是说了这么多之后,您所做的似乎并不迅速。这些数据来自哪里?也就是说,您从哪里获得了userObjects
?在我看来,你应该把它解析成Swift对象,这样你就不需要像任何对象那样的非类型化的东西了。我从algolia和firebase那里得到数据。我将用户信息存储在firebase中,使用algolia运行搜索查询,然后在客户端返回搜索结果。这当然不理想,但在Firebase Firestore支持geoqueriesBefore subscript、在subscript之前将任何类型的值强制转换为适当类型(如Dictionary)以及将任何类型的值强制转换为适当类型(如Dictionary)之前,这是必要的