繁体   English   中英

将字典转换为Swift(iOS)中的对象

[英]Cast dictionary as object in swift (ios)

我有此功能searchMoviesOnJson:

func searchMoviesOnJson(imdbTitle: String, completionHandler: @escaping (Dictionary<String, Any>?) -> ()) {

let urlByName: String = "https://www.omdbapi.com/?s=\(imdbTitle)&type=movie"

//returns a list of movies that contains the title searched
//------------------------------------------------

Alamofire.request(urlByName).responseJSON {
    response in

    switch response.result {

    case .success(let value):
        let moviesJSON = value
        completionHandler(moviesJSON as? Dictionary<String, Any>)

    case .failure(_):
        completionHandler(nil)
    }
}
//------------------------------------------------
}

这给了我来自api的响应(例如:imdbTitle =“ arq”):

{
Response = True;
Search =     (
            {
        Poster = "https://images-na.ssl-images-amazon.com/images/M/MV5BMjAxODQ2MzkyMV5BMl5BanBnXkFtZTgwNjU3MTE5OTE@._V1_SX300.jpg";
        Title = ARQ;
        Type = movie;
        Year = 2016;
        imdbID = tt5640450;
    },
            {
        Poster = "N/A";
        Title = Arq;
        Type = movie;
        Year = 2011;
        imdbID = tt2141601;
    },
            {
        Poster = "N/A";
        Title = "A.R.Q.";
        Type = movie;
        Year = 2015;
        imdbID = tt3829612;
    }
);
totalResults = 3;
}

所以我创建了一个此类MovieByTitle

class MovieByTitle {

var poster : String?
var title  : String?
var year   : Int?
var imdbID : String?

init(poster: String?, title: String?, year: Int?, imdbID: String?) {

    //validation

    if let isPoster = poster { self.poster = isPoster }
    else { self.poster = nil }

    if let isTitle = title { self.title = isTitle }
    else { self.title = nil }

    if let isYear = year { self.year = isYear }
    else { self.year = nil }

    if let isImdbID = imdbID { self.imdbID = isImdbID }
    else { self.imdbID = nil }

}
}

现在我很怀疑,我也创建了这个MovieDAO:

MovieDao类{

func getMovies(imdbTitle: String, completionHandler: @escaping (([MovieByTitle]) -> ())) {

    //function that conects to the api
    searchMoviesOnJson(imdbTitle: imdbTitle, completionHandler: {
       moviesJSON in

        //array to keep the attributes received by the dictionary
        var moviesArray = [MovieByTitle]()

        //searchResults is the response from my request as an array
        if let searchResults = moviesJSON?["Search"] as? NSArray{

            for searchResult in searchResults {

                let movieResult = searchResult as! Dictionary<String,Any>
                let movieDetail = MovieByTitle()

                movieDetail.poster = movieResult["Poster"] as? String
                movieDetail.title = movieResult["Title"] as? String
                movieDetail.year = movieResult["Year"] as? Int
                movieDetail.imdbID = movieResult["imdbID"] as? String

                moviesArray.append(movieDetail)

            }
        }
    })
  }
}

但是xcode在一行中返回错误:let movieDetail = MovieByTitle()

错误消息:调用中缺少参数“海报”的参数(以此类推)

正确的sintax是什么? 将字典响应转换为对象的更好方法是什么?

MovieByTitle初始化函数需要缺少4个参数。

解决方案1:添加辅助初始化:

init() {}

解决方案2:通过为它们提供默认值,将现有的初始化参数定义为可选参数:

init(poster: String? = nil, title: String? = nil, year: Int? = nil, imdbID: String? = nil)

解决方案3:使用所需的参数调用现有的init:

let movieDetail = MovieByTitle(poster: movieResult["Poster"] as? String, title: movieResult["Title"] as? String, year: movieResult["Year"] as? Int, imdbID: movieResult["imdbID"] as? String)

您的init函数需要4个参数。 您尚未添加任何内容。 尝试以下

let poster = movieResult["Poster"] as? String
let title = movieResult["Title"] as? String
let year = movieResult["Year"] as? Int
let imdbID = movieResult["imdbID"] as? String

let movieDetail = MovieByTitle(poster:poster, title:title, year:year, imdbID:imdbDB)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM