Swiftui 如何从另一个结构中的一个结构初始化属性

Swiftui 如何从另一个结构中的一个结构初始化属性,swiftui,Swiftui,我正在寻找一些代码(SwiftUI)来将一个JSON文件从一个网站导入我的Xcode项目,我发现了一个很好的示例,但当我试图更改代码并想在另一个结构中使用一个结构中的“var”时 struct Course: Decodable, Identifiable, Hashable { let id: Int let name: String var link: String let imageUrl: String let number_of_lessons:

我正在寻找一些代码(SwiftUI)来将一个JSON文件从一个网站导入我的Xcode项目,我发现了一个很好的示例,但当我试图更改代码并想在另一个结构中使用一个结构中的“var”时

struct Course: Decodable, Identifiable, Hashable {
    let id: Int
    let name: String
    var link: String
    let imageUrl: String
    let number_of_lessons: Int
}

class NetworkManager: ObservableObject {
    @Published var courses = [Course]()

    func getAllCourses() {
        guard let url = URL(string: "https://api.letsbuildthatapp.com/jsondecodable/courses") else { return }

        URLSession.shared.dataTask(with: url) { data, response, error in
            do {
                let courses = try JSONDecoder().decode([Course].self, from: data!)
                DispatchQueue.main.async {
                    self.courses = courses
                    print(courses)
                }
            } catch {
                print("Failed To decode: ", error)
            }
        }.resume()
    }

    init() {
        getAllCourses()
    }
}

struct SwiftUIView: View {
    var cs:Course
    var body: some View {
        Text(cs.name)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        SwiftUIView() //here it says Missing argument for parameter...
    }

Xcode表示:调用中缺少参数“cs”的参数,请插入“cs:”。

当您试图初始化结构时,需要使用setter传递所有属性,这里是
cs
,因为
body
是一个get-only属性


您需要通过
SwiftUIView(cs:Course)
传递
课程
对象。此课程可以只是一个静态课程,因为它仅用于SwiftUI预览。

Swift自动生成结构的初始值设定项,因此您的SwiftUIView有一个类似的初始值设定项:

public init(cs: Course) {
    self.cs = cs
}
struct ContentView_Previews: PreviewProvider {

    static let cs = Course(id: 7,
                           name: "The best course",
                           link: "thebestcourse.com",
                           imageUrl: "thebestcourse.com/image.jpg",
                           number_of_lessons: 5)

    static var previews: some View {
        SwiftUIView(cs: cs)
    }
}
因此,为了在预览中创建SwiftUIView的实例,您必须这样声明它:

public init(cs: Course) {
    self.cs = cs
}
struct ContentView_Previews: PreviewProvider {

    static let cs = Course(id: 7,
                           name: "The best course",
                           link: "thebestcourse.com",
                           imageUrl: "thebestcourse.com/image.jpg",
                           number_of_lessons: 5)

    static var previews: some View {
        SwiftUIView(cs: cs)
    }
}

好的,我不太确定我是否理解正确,我试图初始化它,但我只得到了SwiftUIView(cs:course)使用未解析标识符'course'的错误。当我尝试SwiftUIView(cs:Course)时,它说:无法将'Course.type'类型的值转换为预期的参数类型'Course',您需要添加所有属性来初始化结构,因此
课程(id:1,名称:“test”,链接:“test”,图像URL:“test”,会话数:1)
。这将创建此结构的新实例。请阅读关于初始化的Swift手册,上面都有描述。我尝试了你的方法,但现在我有一个问题,我只从静态let声明中获取值,如果我想在ContentView(我的主视图)中调用SwiftUIView,我将在调用中获取参数“cs”的错误缺少参数,插入“cs:”。您需要在声明前面加上static,预览才能正常工作。不要使用内部实际视图。可能还包括您的ContentView代码。