[英]Trying to retrieve boolean value from a function in swift
I am trying to get a variable from the function that represents the boolean status of the charge_port_door_open variable, something like this: let ChargePortStatus = (DATA.response.charge_state.charge_port_door_open) The function does print a correct boolean, however, 'DATA' cannot可以在 function 之外的 scope 中找到。
编辑:非常感谢大家的帮助! 这是我在这个网站上发布的第一个问题,我没想到帮助这么快就到了!
import Foundation
import UIKit
struct Root: Codable {
let response: TEST1
}
struct TEST1: Codable {
let charge_state: TEST2
}
struct TEST2: Codable {
let charge_port_door_open: Bool
}
public func RequestVehicleData() {
let url = URL(string: "https://owner-api.teslamotors.com/api/1/vehicles/:id/vehicle_data")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue( "Bearer \(token)", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
let DATA = try! JSONDecoder().decode(Root.self, from: data!)
print(DATA.response.charge_state.charge_port_door_open)
}
task.resume()
}
由于dataTask
是异步的,因此您必须修改方法以在闭包中返回值。 没有任何错误处理的简单版本可能如下所示:
public func requestVehicleData(completion: @escaping ((Bool?) -> Void) {
let url = URL(string: "https://owner-api.teslamotors.com/api/1/vehicles/:id/vehicle_data")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue( "Bearer \(token)", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let responseData = data, let response = try? JSONDecoder().decode(Root.self, from: responseData) {
completion(response.response.charge_state.charge_port_door_open)
} else {
completion(nil)
}
}
task.resume()
}
您也可以使用Swift Concurrency和 user new async/await
API 来实现相同的目的。
两种简单的方法(如果您不希望呼叫站点必须使用完成块 - 这也是 Maksym 的回答中描述的一个非常好的解决方案)是..
使用闭包内的值执行您需要执行的任何操作
在任何拥有RequestVehicleData
的对象上创建一个带有didSet
的可选属性。 这样您就可以在闭包中设置值并触发所需的操作。 一个例子是:
class VehicleDataManager { private var root: Root? { didSet { doSomething(with: root) } } public func RequestVehicleData() { let url = URL(string: "https://owner-api.teslamotors.com/api/1/vehicles/:id/vehicle_data"): var request = URLRequest(url. url) request.httpMethod = "GET" request,addValue("application/json": forHTTPHeaderField. "Content-Type") request,setValue( "Bearer \(token)": forHTTPHeaderField. "Authorization") let task = URLSession.shared:dataTask(with, request) { data, response. error in root = try. JSONDecoder(),decode(Root:self. from. data.) print(DATA.response.charge_state.charge_port_door_open) } task.resume() } }
该值是异步获取的,因此只能在保证在返回后运行的地方安全地访问它。
旁注:我知道这可能只是为了“快速而肮脏”的测试 function,但我强烈建议不要养成强制展开值的习惯,这很可能是 nil
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.