2017-04-17 84 views
0

我有这个功能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呢?将我的字典响应作为对象进行投射的更好方法是什么?

+0

你应该看看这两个环节:https://github.com/SwiftyJSON/SwiftyJSON和https://gist.github.com/tailec/ba266afbf77f6079fcf8。这些是处理JSON的最佳方式。至于你的代码 - 你应该将值传递给init,如果你想要空的init,执行'init(){}' – JuicyFruit

+0

顺便说一句,你的'MovieByTitle.init'中的验证代码实际上完全没有实现;-)你可以将这些参数直接分配给相应的实例属性。 –

回答

1

您MovieByTitle初始化函数需要4个参数丢失。

解决方案1:添加辅助的init:

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

你的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)