调用中参数“from”缺少参数 - SwiftUI

Boo*_*rry 1 xcode json ios swift swiftui

我正在构建一个 SwiftUI 应用程序,它可以从Movie Database API中按类型检索一系列电影。

用户选择电影后,我会创建第二个 API 来获取该特定电影的详细信息。我正在使用 @Published 通知视图更改,但是每当我调用模型的实例时,我都会收到错误“调用中的参数‘from’缺少参数”。

这是模型:

import Foundation

// MARK: - MovieList
struct MovieList: Codable {
    let page: Int
    let totalResults: Int
    let totalPages: Int
    let movie: [Movie]

    enum CodingKeys: String, CodingKey {
        case page
        case totalResults = "total_results"
        case totalPages = "total_pages"
        case movie = "results"
    }
}

// MARK: - Movie
struct Movie: Codable {
    let popularity: Double
    let voteCount: Int
    let video: Bool
    let posterPath: String?
    let id: Int
    let adult: Bool
    let backdropPath: String?
    let title: String
    let voteAverage: Double
    let overview: String
    let releaseDate: String?
    let runTime: Int?
    
    enum CodingKeys: String, CodingKey {
        case popularity
        case voteCount = "vote_count"
        case video
        case posterPath = "poster_path"
        case id, adult
        case backdropPath = "backdrop_path"
        case title
        case voteAverage = "vote_average"
        case overview
        case releaseDate = "release_date"
        case runTime = "runtime"
    
    }
}
Run Code Online (Sandbox Code Playgroud)

这是视图模型:

import Foundation

class DetailViewModel: ObservableObject {
    
    @Published var fetchedMovie = Movie() // getting error here
    
    func getMovieDetails(id: Int) {
        
        WebService().getMovieDetails(movie: id) { movie in
            
            if let movieDetails = movie {
                
                self.fetchedMovie = movieDetails
  
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是网络调用:

func getMovieDetails(movie: Int, completion: @escaping (Movie?) -> ()) {
        
        guard let url = URL(string: "https://api.themoviedb.org/3/movie/\(movie)?api_key=5228bff935f7bd2b18c04fc3633828c0") else {
            fatalError("Invalid URL")
        }
            
            let config = URLSessionConfiguration.default
            let session = URLSession(configuration: config)
            
            let task = session.dataTask(with: url) { data, response, error in
                
                // Check for errors
                guard error == nil else {
                    print ("error: \(error!)")
                    return
                }
                // Check that data has been returned
                guard let data = data else {
                    print("No data")
                    return
                }
                
                do {

                    let decoder = JSONDecoder()
                    let movieDetails = try decoder.decode(Movie.self, from: data)
                    
                    DispatchQueue.main.async {
                    
                       completion(movieDetails)
                        
                        
                    }
                    
                } catch let err {
                    print("Err", err)
                }
            }
            // execute the HTTP request
            task.resume()
        }
    }
Run Code Online (Sandbox Code Playgroud)

和查看代码:

import SwiftUI

struct MovieDetailView: View {
    
    @ObservedObject private var detailVM = DetailViewModel() // error here: Missing argument for parameter 'movie' in call
    
    var movie: DetailViewModel
    
    var body: some View {
        
        VStack {
            
            URLImage(url: "\(movie.backdropURL)")
                .aspectRatio(contentMode: .fit)
            
            Text("\(detailVM.movieRunTime) mins")
            
            Text(movie.movieOverview)
                .padding()
            
            Spacer()
            
        }.onAppear {
            self.detailVM.getMovieDetails(id: self.movie.id)
        }
        .navigationBarTitle(movie.movieTitle)
    }
}

struct MovieDetailView_Previews: PreviewProvider {
    static var previews: some View {
        MovieDetailView(movie: DetailViewModel(movie: Movie.example))
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

use*_*632 5

你不能像这样初始化 Movie 对象......它需要Decoder对象或所有成员明智的初始化 --- 你可以像这样定义你的函数

class DetailViewModel: ObservableObject {
    
    @Published var fetchedMovie : Movie? 
    
    func getMovieDetails(id: Int) {
        
        WebService().getMovieDetails(movie: id) { movie in
            
            if let movieDetails = movie {
                
                self.fetchedMovie = movieDetails
  
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)