swift - 实例成员不能用于可编码 JSON 类型
问题描述
除了 JSONDecoder 块之外,我似乎无法在任何地方访问结构成员。如何在其他地方访问这些 api 返回值,例如在可以在任何地方调用并返回 api 数据的函数中。最后一行超出范围或不允许。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
struct ObjectLookup: Codable {
let ObjectID: Int?
let ObjectName: String?
let Creators: String?
let Medium: String?
let Titles: String?
let LabelUUID: String?
static func fetch(withID id : String){
let urlString = DomainURL + "\(id)"
print("urlString is \(urlString)" )
if let url = URL(string: urlString) {
let task = URLSession.shared.dataTask(with: url, completionHandler: { (data,response,error) in
print(String(data: data!,encoding: .ascii) ?? "no data")
if let ObjectLookup = try? JSONDecoder().decode(ObjectLookup.self, from: data!) {
print( ObjectLookup.ObjectName ?? "no url")
}
})
task.resume()
}else{
print("bad url")
}
}
}
ObjectLookup.fetch(withID: "2322A63C74C92")
let myName = ObjectLookup.ObjectName
}
解决方案
将其重构为
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
ObjectLookup.fetch(withID: "2322A63C74C92") { obj in
print(obj?.ObjectName)
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
}
struct ObjectLookup: Codable {
let ObjectID: Int?
let ObjectName: String?
let Creators: String?
let Medium: String?
let Titles: String?
let LabelUUID: String?
static func fetch(withID id : String,completion:@escaping(_ ret:ObjectLookup?) -> Void ){
let urlString = DomainURL + "\(id)"
print("urlString is \(urlString)" )
if let url = URL(string: urlString) {
let task = URLSession.shared.dataTask(with: url, completionHandler: { (data,response,error) in
print(String(data: data!,encoding: .ascii) ?? "no data")
if error != nil {
compeltion(nil)
return
}
if let res = try? JSONDecoder().decode(ObjectLookup.self, from: data!) {
print( res.ObjectName ?? "no url")
completion(res)
}
})
task.resume()
}else{
print("bad url")
completion(nil)
}
}
}
不要大写变量名的第一个字母使用camelCase(只对类这样做),我知道更改任何字母都会破坏编码过程,所以请记住它或使用CodingKeys来转换变量,还要注意URLSession.shared.dataTask
回调在后台队列中,所以考虑使用
DispatchQueue.main.async {}
viewDidLoad
如果你想做任何 UI 操作,内部回调
推荐阅读
- python - Python - 烧瓶和 werkzeug - 继续给出“BadRequestKeyError:400 Bad Request:KeyError:'file'”
- cuda - Cuda 高效矩阵加法
- oracle - Oracle 循环 - 声明
- reinforced-typings - 配置增强类型以将类导出为 AMD 模块
- http - HTTP 服务器在收到“Origin: null”标头时应该做什么?(CORS)
- r - 如何将 & 运算符应用于 R 中的布尔矩阵?
- bash - 在 Bash for 循环中,我可以将上一次迭代的标准输出读取为标准输入吗?
- java - 无法使用 JMX 从 Java VisualVM 连接远程 Java 应用程序
- javascript - 根据事件多次渲染组件
- html - 如何在发布请求中将标头添加到 gsp 中的第 3 方 api