提问者:小点点

在SwiftUI中如何将数据从一个类发送到另一个类?


我的应用程序中目前有两个类。

一个类将重要值存储在与用户输入相对应的变量中(例如大小,颜色,宽度)。

另一个类向API发起URLRequest以获取数据。

我的目标是使URL中的一个参数根据存储在第一个类的变量中的值进行更改。

例如,URL如下所示:“www.google.com/docs/(VAR)”我用API请求将VAR变成类中的一个变量,并尝试使用第一个类中的变量,用条件语句对其进行变异。

不幸的是,这给了我一个错误,我无法在两个类之间传输数据。

有什么建议吗?

下面是第一个类的代码:

import Foundation

class Product: ObservableObject, CustomStringConvertible {
    @Published var color = ""
    @Published var size = ""
    @Published var finish = ""
    @Published var cut = ""
    @Published var length = ""
    @Published var type = ""

    var description: String {
        "\(size) - \(finish) - \(cut) -\(length)"
    }
}

下面是APIRequest的代码

import Foundation


class APIRequest: ObservableObject {

    @Published
    var lengthOptions: [String] = []

    init () {
        fetchLengths { lengths in
            self.lengthOptions = lengths[0].OptionList.map { $0.OptionName }
        }

    }



    private func fetchLengths (completion: @escaping ([OptionsHead]) -> ()) {

        let catalogID = 1877
       // how can I change catalogID based on Product class variables


        guard let url = URL(string: "blablaAPI.com/Products/\(catalogID)/Options?limit=1&offset=3")
            else {
                fatalError("URL is not correct")
        }

        var request = URLRequest(url: url)

        request.addValue("12345", forHTTPHeaderField: "PrivateKey")
        request.addValue("https://www.blaaaaa.com", forHTTPHeaderField: "SecureURL")
        request.addValue("12345", forHTTPHeaderField: "Token")

        request.httpMethod = "GET"        // "POST", "PUT", "DELE"


        URLSession.shared.dataTask(with: request) { data, _, _ in
            let outputs = try!
                JSONDecoder().decode([OptionsHead].self, from: data!)
            DispatchQueue.main.async {
                completion(outputs)
            }

        }.resume()

    }
}

共1个答案

匿名用户

您可以尝试将产品传递给您的APIRequest类,以根据产品类变量更改catalogID,如下所示:

class APIRequest: ObservableObject {

@Published var lengthOptions: [String] = []

@ObservedObject var product: Product

init (product: Product) {
    self.product = product
    fetchLengths { lengths in
        self.lengthOptions = lengths[0].OptionList.map { $0.OptionName }
    }
}

private func fetchLengths (completion: @escaping ([OptionsHead]) -> ()) {

    var catalogID = 1877
    // how can I change catalogID based on Product class variables
    if product.type == "some type" {
        catalogID = 1234
    } else {
        catalogID = 4321
    }

    ....

}