Swiftui 如何从另一个结构中的一个结构初始化属性
我正在寻找一些代码(SwiftUI)来将一个JSON文件从一个网站导入我的Xcode项目,我发现了一个很好的示例,但当我试图更改代码并想在另一个结构中使用一个结构中的“var”时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:
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代码。