Как инициализировать свойство из одной структуры в другую структуру - PullRequest
0 голосов
/ 20 октября 2019

Я искал некоторый код (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 #>'.

Ответы [ 2 ]

0 голосов
/ 20 октября 2019

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)
    }
}
0 голосов
/ 20 октября 2019

Когда вы пытаетесь инициализировать структуру, вам нужно передать все свойства с помощью сеттеров, здесь это cs, так как body это свойство только для получения.

Вам нужно будет передатьCourse объект через SwiftUIView(cs: course). Этот курс может быть просто статическим, поскольку он используется только в предварительном просмотре SwiftUI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...