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

问题描述 投票:0回答:2

我正在寻找一些代码(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:'。

swiftui json-api
2个回答
0
投票

[当您尝试初始化结构时,您需要传递带有setter的所有属性,此处为cs,因为body是仅获取的属性。

您将需要通过Course传递SwiftUIView(cs: course)对象。本课程只能是静态课程,因为它仅在您的SwiftUI预览中使用。


0
投票

Swift自动为结构生成初始化程序,因此您的SwiftUIView具有如下所示:

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

因此,为了在预览中创建SwiftUIView的实例,您必须像这样声明它:

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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.