我一直在寻找一些代码(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:<#Course#>'。
答案 0 :(得分:0)
在尝试初始化结构时,您需要传递带有setter的所有属性,这里的cs
是因为body
是仅获取属性。
您将需要通过Course
传递SwiftUIView(cs: course)
对象。该课程只能是静态课程,因为它仅在您的SwiftUI预览中使用。
答案 1 :(得分: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)
}
}