ios - 无法从 Observable 对象中提取数据

标签 ios swiftui combine

我正在尝试显示来自观察对象的数据。

最初,我试图保持简单,仅显示结构的一个成员:“base”(值:“stations”)。

struct Sample: Codable {
    let coord: Coord
    let weather: [Weather]
    let base: String
    let main: Main
    let visibility: Int
    let wind: Wind
    let clouds: Clouds
    let dt: Double
//    let sys: Sys
    let id: Int
    let name: String
//    let cod: Int
}

我用“?”做了一些防御性编码但我收到以下编译器错误:

enter image description here

所以我替换了“?”与“!”,知道我应该有一些数据。

enter image description here

我发现这令人沮丧,因为它来自命令式范式背景。
我做错了什么?

这是数据转储:

Sample(coord: DataTaskPubTab.Coord(lon: -0.13, lat: 51.51), weather: [DataTaskPubTab.Weather(id: 300, main: "Drizzle", description: "light intensity drizzle")], base: "stations", main: DataTaskPubTab.Main(temp: 280.32, pressure: 1012, humidity: 81, tempMin: 279.15, tempMax: 281.15), visibility: 10000, wind: DataTaskPubTab.Wind(speed: 4.1, deg: 80), clouds: DataTaskPubTab.Clouds(all: 90), dt: 1485789600.0, id: 2643743, name: "London")

这是可观察对象:

class StandardWeatherReportLoader: ObservableObject {
    @Published var networkMessage: String?
    @Published var hasAlert = false
    @Published var weatherReport: Sample?
    @Published var hasReport = false

    func doStandard() {
        let url = EndPoint.weather.path()
        var request = URLRequest(url: EndPoint.weather.path()!)
        request.httpMethod = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        let task = URLSession.shared.dataTask(with: url!) { (data: Data?, _: URLResponse?, error: Error?) -> Void in
            DispatchQueue.main.async {
                guard error == nil else {
                    self.networkMessage = error?.localizedDescription
                    self.hasAlert = true
                    return
                }

                do {
                    let decoder = JSONDecoder()
                    decoder.keyDecodingStrategy = .convertFromSnakeCase
                    let result = try decoder.decode(Sample.self, from: data!)
                    self.weatherReport = result
                    self.hasReport = true
                    print(result)
                } catch let error as NSError {
                    print(error)
                }
            }
        }
        task.resume()
    }
}

最佳答案

显然这有效:

struct StandardWeatherView: View {
    @EnvironmentObject var settings: Settings
    @ObservedObject var standardWeatherReportLoader = StandardWeatherReportLoader()

    init() {
        self.standardWeatherReportLoader.doStandard()
    }

    var body: some View {
        NavigationView {
            ZStack {
                Color("FernGreen").edgesIgnoringSafeArea(.all)
                VStack {
                    if standardWeatherReportLoader.weatherReport?.base == nil {
                        Text("Sorry, NO data.")
                    } else {
                        Text(standardWeatherReportLoader.weatherReport!.base)
                    }

                    Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
                }
                .navigationBarTitle(Text("Weather Report"), displayMode: .inline)
            }.alert(isPresented: $standardWeatherReportLoader.hasAlert, content: { () -> Alert in
                Alert(title: Text(verbatim: standardWeatherReportLoader.networkMessage!))
            })
        }
    }
}

enter image description here

关于ios - 无法从 Observable 对象中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59779479/

相关文章:

swift - String.localizedStringWithFormat(_ :_:) for SwiftUI's LocalizedStringKey?) 等价于什么

ios - 使用导航 Controller 在 View Controller 之间进行切换

ios - 如何使用 Objective-C 显示多个自定义单元格?

ios - 在运行时从字符串中从代码访问 UILabel

ios - SwiftUI 列表仅使用给定数组的第一项

ios - 使用 SwiftUI 从 Wireframe 创建一个新的 VIPER 模块

ios - 控制导航栏下的定位问题

swiftui - UIViewRepresentable 无法在模态呈现的 SwiftUI View 中工作

swift - 循环 Publisher Combine 框架

SwiftUI 在滚动列表期间停止更新