繁体   English   中英

试图从 swift 中的 function 中检索 boolean 值

[英]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 来实现相同的目的。

PS 如果有机会,请查看一些基础知识API 设计指南

两种简单的方法(如果您不希望呼叫站点必须使用完成块 - 这也是 Maksym 的回答中描述的一个非常好的解决方案)是..

  1. 使用闭包内的值执行您需要执行的任何操作

  2. 在任何拥有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM