Ошибка набора в Snap Snap Kit (Swift)

Копирование документации дает мне "Тип" [AnyHashable: Any]?' не имеет подписных элементов. Ошибка происходит в строке "let data = ". Если я принудительно разверну ресурсы, ошибка переместится на следующую строку

let graphQLQuery = "{me{displayName, bitmoji{avatar}, externalId}}"
    let variables = ["page": "bitmoji"]

    SCSDKLoginClient.fetchUserData(withQuery: graphQLQuery, variables: variables, success: { (resources: [AnyHashable: Any]?) in
        let data = resources["data"] //error here
        let me = data["me"]
        let displayName = me["displayName"]
        let bitmoji = me["bitmoji"]
        let bitmojiAvatarUrl = bitmoji["avatar"]
    }, failure: { (error: Error?, isUserLoggedOut: Bool) in
        // handle error
    })

Если я разверну ресурсы данных и данные, то ошибка переместится на строку, где я пытаюсь установить меня = data["me"] (error = "Тип Any не имеет нижестоящих элементов"). Тогда, если я попытаюсь развернуть меня, ошибка останется.

например:

let graphQLQuery = "{me{displayName, bitmoji{avatar}, externalId}}"

let variables = ["page": "bitmoji"]

        SCSDKLoginClient.fetchUserData(withQuery: graphQLQuery, variables: variables, success: { (resources: [AnyHashable: Any]?) in
            guard let response = resources else { return }
            guard let data = response["data"] else { return }
            print(data)
            let me = data["me"] // error here
            let displayName = me["displayName"]
            let bitmoji = me["bitmoji"]
            let bitmojiAvatarUrl = bitmoji["avatar"]
        }, failure: { (error: Error?, isUserLoggedOut: Bool) in
            // handle error
        })

Распечатка возвращаемых данных:

{
    me =     {
        bitmoji =         {
            avatar = "{URL}";
        };
        displayName = "{NAME}";
        externalId = "{ID}";
    };
}

1 ответ

Это потому что [AnyHashable: Any]? является optional вот почему он дает ошибку

"Введите '[AnyHashable: Any]?' не имеет подписчиков

Так что для этого вам нужно обернуть его if let состояние, как показано ниже:

if let response = resources {
    let data = response["data"] //then cast your objects here
}

Или вы можете использовать guard let для этого:

guard let response = resources else { return }

после этого вы можете использовать response объект.

Другие вопросы по тегам