首页 > 解决方案 > 基于 json 遍历结构数组导致预览失败

问题描述

该代码从 list.json 获取 json 数据,我创建了一个快速视图 BookView 作为另一个文件。

import SwiftUI

struct product: Codable, Hashable {
    var name: String
    var author: String
    var page: String
}

struct ContentView: View {
    
    func jsonTwo() -> [product]{
            let url = Bundle.main.url(forResource: "list", withExtension: "json")!
            let data = try! Data(contentsOf: url)
            let decoder = JSONDecoder()
            let products = try? decoder.decode([product].self, from: data)
            return products!
        }
    
    @State var number: Int = 5
    
    var body: some View {
        NavigationView {
            VStack {
                Form {
                    ForEach(jsonTwo(), id: \.self) {item in
                        BookView(name: "item.name",author: "item.author",page: "item.page")
                    }
                }
                .navigationBarTitle("Books")
                Button(action: {
                    // Button tapped
                }, label: {
                        Image(systemName: "plus.rectangle")
                            .font(Font.system(.largeTitle).bold())
                            .foregroundColor(.primary)
                    })
                        .padding(.top)
            }
        }
    }

}

此代码给了我错误“无法在此文件中预览 - 无法更新预览”,但以下代码工作正常(ForEach 语句中的差异)。注意我将 BookView 的参数放在引号中以进行测试。

import SwiftUI

struct product: Codable, Hashable {
    var name: String
    var author: String
    var page: String
}

struct ContentView: View {
    
    func jsonTwo() -> [product]{
            let url = Bundle.main.url(forResource: "list", withExtension: "json")!
            let data = try! Data(contentsOf: url)
            let decoder = JSONDecoder()
            let products = try? decoder.decode([product].self, from: data)
            return products!
        }
    
    @State var number: Int = 5
    
    var body: some View {
        NavigationView {
            VStack {
                Form {
                    ForEach(0..<number) {item in
                        BookView(name: "item.name",author: "item.author",page: "item.page")
                    }
                }
                .navigationBarTitle("Books")
                Button(action: {
                    // Button tapped
                }, label: {
                        Image(systemName: "plus.rectangle")
                            .font(Font.system(.largeTitle).bold())
                            .foregroundColor(.primary)
                    })
                        .padding(.top)
            }
        }
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .previewDevice("iPhone 11")
    }
}

标签: jsonswiftswiftui

解决方案


推荐阅读