调用中缺少参数“from"的参数 - SwiftUI [英] Missing argument for parameter 'from' in call - SwiftUI

查看:21
本文介绍了调用中缺少参数“from"的参数 - SwiftUI的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个 SwiftUI 应用程序,它从 电影数据库 API.

I'm building a SwiftUI app that retrieves an array of movies by genre from The Movie Database API.

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

Once the user selects a movie, I make a second API to get details for that specific movie. I'm using @Published to notify the view of changes however I am getting the I get the error "Missing argument for parameter 'from' in call" whenever I call an instance of the Model.

这是模型:

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"
    
    }
}

这是视图模型:

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
  
            }
        }
    }
}

这是网络调用:

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()
        }
    }

和查看代码:

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))
    }
}

任何帮助将不胜感激.

推荐答案

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

You cant initialise Movie object like this ... it needs Decoder object or all member wise intialization --- You can define your function like this

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

这篇关于调用中缺少参数“from"的参数 - SwiftUI的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆