Тип «Любой» не имеет подписных элементов в Swift - PullRequest
0 голосов
/ 26 мая 2018

Прошу прощения за заголовок.Я понимаю, что это распространенная проблема в 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}

Я получаю типичную ошибку Type 'Any' has no subscript members во второй строке фрагмента выше, пока не добавлю as? [String:AnyObject] к первой строке фрагмента.Проблема в том, что теперь код разрывается в первом операторе защиты для user, как будто это утверждение неверно.

Что я делаю не так и как правильно приводить объекты?

Пример того, как выглядит элемент в 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;

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Когда вы говорите

guard let user = userObjects[indexPath.row]["data"] as? [String:AnyObject] else { return cell }

... вы говорите, что user - это запись "data":

data = (
            {
                email = "tester2@test.com";
                "first_name" = Tester;
                gender = Male;
                instagram = "n/a";                      
                "last_name" = One;
                preference = Female;
                profileImageURL = "n/a";
    }
);

Это не словарь.Это массив словарей.Следовательно, попытка подписать его с "first_name" не удалась.

0 голосов
/ 26 мая 2018

Согласно вашим пользовательским данным, data - это массив пар ключ-значение, поэтому сначала вы должны получить данные из словаря, а затем вам нужно получить объект из данных (массива словаря) следующим образом:

Вы можете добавить значение типа [[String: AnyObject]]: -

guard let user = userObjects["data"][indexPath.row] as? [String:AnyObject] else { return cell }
guard let firstName = user["first_name"] else {return cell}
0 голосов
/ 26 мая 2018

Вы должны разыграть userObjects[indexPath.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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...