在解码“非常简单的”嵌套JSON时得到nil
,我在这里缺少什么?
[NetworkController
部分(连同整个ContentView
)与“普通” JSON(即{"greetings": "hi"}
)完美搭配,但我仍然使用嵌套的JSON结构获得nil
这是我的JSON:
index.json
{
"products": {
"pasta": 81.22,
"pizza": 13.81,
"apples": 0,
"sausages": 2.36,
"potatoes": 0.55,
"cucmbers": 2.06,
"oranges": 0
}
}
这是我的代码:
DataStruct.swift
struct ProductWrapper: Decodable {
var products: Product
}
struct Product: Decodable {
var pasta: Double
var pizza: Double
var apples: Double
var sausages: Double
var potatoes: Double
var cucmbers: Double
var oranges: Double
}
ContentView.swift
import SwiftUI
class ProductsList: ObservableObject {
@Published var prods: ProductWrapper? = nil
func fetchProducts() {
NetworkController.fetchProducts { prods in
self.prods = prods
}
}
}
struct ContentView: View {
@ObservedObject var DecodedProducts = ProductsList()
var body: some View {
VStack{
HStack{
Text("Pasta: ")
Text(String("\(self.DecodedProducts.prods?.products.pasta)")).fontWeight(.bold).foregroundColor(.red)
}
HStack{
Text("Pizza: ")
Text(String("\(self.DecodedProducts.prods?.products.pizza)")).fontWeight(.bold).foregroundColor(.blue)
}
HStack{
Text("Apples: ")
Text(String("\(self.DecodedProducts.prods?.products.apples)")).fontWeight(.bold).foregroundColor(.green)
}
}.padding()
}
}
NetworkManager.swift
import Foundation
struct NetworkController {
static func fetchProducts(completion: @escaping ((ProductWrapper) -> Void)) {
if let url = URL(string: "http://localhost:1234/index.json") {
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { (data, resp, err) in
do {
if let products = data {
let prods = try JSONDecoder().decode(ProductWrapper.self, from: products)
DispatchQueue.main.async() {
completion(prods)
}
} else {
print("Error Found")
}
} catch let err as NSError {
print(err.localizedDescription)
}
}.resume()
}
}
}
预先感谢!
发现问题;
那只是愚蠢的我...
[忘记在fetchProducts()
* facepalm *中调用onAppear
.onAppear{
self.DecodedProducts.fetchProducts()
}
这里是正确的代码:
ContentView.swift
import SwiftUI
class ProductsList: ObservableObject {
@Published var prods: ProductWrapper? = nil
func fetchProducts() {
NetworkController.fetchProducts { prods in
self.prods = prods
}
}
}
struct ContentView: View {
@ObservedObject var DecodedProducts = ProductsList()
var body: some View {
VStack{
HStack{
Text("Pasta: ")
Text(String("\(self.DecodedProducts.prods?.products.pasta ?? 0)")).fontWeight(.bold).foregroundColor(.red)
}
HStack{
Text("Pizza: ")
Text(String("\(self.DecodedProducts.prods?.products.pizza ?? 0)")).fontWeight(.bold).foregroundColor(.blue)
}
HStack{
Text("Apples: ")
Text(String("\(self.DecodedProducts.prods?.products.apples ?? 0)")).fontWeight(.bold).foregroundColor(.green)
}
}.onAppear{
self.DecodedProducts.fetchProducts()
}
}
}