我有这个功能searchMoviesOnJson:演员字典作为SWIFT(IOS)对象
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/[email protected]_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的管线返回一个错误: 让movieDetail = MovieByTitle()
错误消息:在呼叫与缺少参数 '海报' 参数(等其他)
什么是正确的sintax呢?将我的字典响应作为对象进行投射的更好方法是什么?
你应该看看这两个环节:https://github.com/SwiftyJSON/SwiftyJSON和https://gist.github.com/tailec/ba266afbf77f6079fcf8。这些是处理JSON的最佳方式。至于你的代码 - 你应该将值传递给init,如果你想要空的init,执行'init(){}' – JuicyFruit
顺便说一句,你的'MovieByTitle.init'中的验证代码实际上完全没有实现;-)你可以将这些参数直接分配给相应的实例属性。 –