【发布时间】:2020-08-22 06:08:46
【问题描述】:
我正在探索 API 并练习使用简单的股票代码检索应用程序。我可以使用自定义查询 URL 成功提取 JSON 数据。我已经正确设置了对象模型:
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)!
}
}
我在 SwiftUI 中,想使用我的 API 请求处理程序创建的 tckr 对象来显示属性。这就是我想要处理对象模型的方式。
//ContentView.swift
struct ContentView: View {
let tckr: TCKR = IEXCloudRequest("AAPL").tckr
var body: some View {
Text(tckr.symbol)
}
}
问题是我不知道如何从 JSONDecoder 中提取解码的 tckr 并在全局范围内使用它。我目前使用的方法是:
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 完成处理程序时无法分配变异的 self 变量,因此无法在全局范围内使用我的 TCKR 对象'。请 Swift 的诸神,帮助兄弟。
【问题讨论】:
标签: json swift swiftui urlsession