Arrays 类型';任何';在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

我为标题道歉。我理解这是Swift中的常见问题。我读了其他线程中的答案,我相信我离解决这个问题有点近了

我有一个字典数组
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)之前,这是必要的