Я изучаю API и практикуюсь с простым приложением для поиска биржевых тикеров. Я могу успешно получить данные JSON с помощью настраиваемого URL-адреса, запрашиваемого пользователем. У меня правильно настроена объектная модель:
struct TCKR: Decodable {
let symbol: String
let delayedPrice: Double?
let iexRealtimePrice: Double
...
}
У меня также есть структура обработчика запросов API, которая обрабатывает строку символа тикера, токен API и создание URL
struct IEXCloudRequest {
var tckr: TCKR! //I swear I'll provide it at some point
let strTckr: String
let myToken = "?token=lqj34poiruadosfnp39u2rkndaslkfnmxnip32ur"
var reqURL: URL {
return URL(string: "blah" + strTckr + myToken)!
}
}
I am в SwiftUI и хочу использовать объект tckr, созданный моим обработчиком запросов API, для отображения свойств. Вот как я хотел бы обрабатывать объектную модель.
//ContentView.swift
struct ContentView: View {
let tckr: TCKR = IEXCloudRequest("AAPL").tckr
var body: some View {
Text(tckr.symbol)
}
}
Проблема в том, что я не знаю, как извлечь декодированный tckr из JSONDecoder и использовать его глобально. Текущий метод, который я использую:
let task = URLSession.shared.dataTask(with: self.reqURL { data, response, error in
if let data = data {
do {
let tckrShell = try JSONDecoder().decode(TCKR.self, from: data)
print("object creation success for ticker: \(String(describing: tckrShell!.symbol))")
//I consistently print from this block so my API Calls and data decoding are working
} catch {
print("we have an E")
print(error)
}
} else {
print("data from URL returned nil")
}
}
task.resume()
Всякий раз, когда я пытаюсь назначить переменную tckrShell
извне, я получаю сообщение об ошибке о том, что я не могу назначить изменяющиеся собственные переменные при использовании @escaping обработчики завершения и, следовательно, не могут использовать мой объект TCKR
«глобально». Пожалуйста, боги Свифта, выручайте брата.