Быстрая область видимости вне функции - PullRequest
0 голосов
/ 16 января 2020

У меня есть одноэлементная URLSession, которая анализирует данные ответов в словаре. Я хочу использовать одно значение из этого словаря в следующем фрагменте кода, но не могу понять, как передать значение из области, в которой оно находится в данный момент.

Вот код в его нынешнем виде:

let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard error == nil else {
            debugPrint ("error: \(error!)")
            return
        }
        guard let content = data else {
            debugPrint("No data")
            return
        }
            guard let json = (try? JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [String: Any] else {
            debugPrint("Not containing JSON")
            return
        }
            if let idToken = json["id_token"] as? String {
                let privateToken = idToken;
                debugPrint("Gotten json response dictionary is \(idToken)")
            }
        }

        task.resume()
        return privateToken

В настоящее время существует ошибка IDE для return privateToken, говорящая о том, что я использую неразрешенный идентификатор: privateToken.

Как я могу взять строку idToken и вернуть ее как privateToken для использования в другом месте?

1 Ответ

3 голосов
/ 16 января 2020

Не могли бы вы использовать обработчик завершения как:

func getPrivateToken(completion: @escaping(String) -> (), failure: @escaping (Error) -> ()) {
    URLSession.shared.dataTask(with: request) { data, response, error in
        guard error == nil else {
            debugPrint ("error: \(error!)")
            failure(error)
            return
        }
        guard let content = data else {
            debugPrint("No data")
            failure(NSError(domain: "Your error message here.", code: 401, userInfo: nil))
            return
        }
        guard let json = (try? JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [String: Any] else {
            debugPrint("Not containing JSON")
            failure(NSError(domain: "Your error message here.", code: 401, userInfo: nil))
            return
        }
        if let idToken = json["id_token"] as? String {
            completion(idToken)
            debugPrint("Gotten json response dictionary is \(idToken)")
        }
    }.resume()
}

И использовать его так:

func exampleFunction() {
    self.getPrivateToken(completion: { (token) in
        // Do what ever you need with the token here.
        print("ID token is: \(token)")
    }) { (error) in
        // Present error here
    }
}
...