Мне нужно выполнить поиск фильма по API и вернуться в таблицу для просмотра найденных фильмов.
Язык
Swift 3 — xcode 8
Функция получения Json из API
Код: Выделить всё
func searchMoviesOnJson(imdbTitle: String, completionHandler: @escaping (Dictionary?) -> ()) {
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)
case .failure(_):
completionHandler(nil)
}
}
//------------------------------------------------
Код: Выделить всё
class Movie {
var poster: String?
var title : String?
var year : String?
var imdbID: String?
init(poster: String?, title: String?, year: String?, imdbID: String?) {
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 }
}
}
Код: Выделить всё
class MovieDAO {
//Search By Title
static func getMovies(imdbTitle: String, completionHandler: @escaping (([Movie]) -> ())) {
searchMoviesOnJson(imdbTitle: imdbTitle, completionHandler: {
newMoviesJSON in
if let moviesJSON = newMoviesJSON {
if moviesJSON["Error"] != nil { return }
else {
//casting
let arrayOfMovies: [[String : String]] = newMoviesJSON!["Search"] as! [[String : String]]
var fetchedMovies = [Movie]()
for eachFetchedMovie: [String : String] in arrayOfMovies {
var poster: String?
var title : String?
var year : String?
var imdbID: String?
if let isPoster = eachFetchedMovie["Poster"] { poster = isPoster }
else { poster = nil }
if let isTitle = eachFetchedMovie["Title"] { title = isTitle }
else { title = nil }
if let isYear = eachFetchedMovie["Year"] { year = isYear }
else { year = nil }
if let isImdbID = eachFetchedMovie["imdbID"] { imdbID = isImdbID }
else { imdbID = nil }
let movie: Movie = Movie(poster: poster, title: title, year: year, imdbID: imdbID)
fetchedMovies.append(movie)
}
completionHandler(fetchedMovies)
}
}
})
}
}
Как мне протестировать эту функцию? Я называю это в своем AppDelegate следующим образом:
Код: Выделить всё
print(MovieDAO.getMovies(imdbTitle: "arq"))
О, я хотел бы напечатать массив с искомым заголовком. Я почти уверен, что моя функция этого не возвращает. Как я могу адаптировать функцию для этого?
Для лучшего понимания API предоставляет этот Json для искомого фильма:
Код: Выделить всё
{
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;
}
Мне понравилось это предложение, и я позвонил (в свой AppDelegate, просто для проверки и просмотра). если он получает то, что хочу, в данном случае список фильмов, содержащих «arq» в названии) моя функция такая:
Код: Выделить всё
MovieDAO.getMovies(imdbTitle: "arq") {
(movies: [Movie]) in
// Do something with the movies
print(movies)
}
Что не так с этой зеленой линией?
Подробнее здесь: https://stackoverflow.com/questions/434 ... -swift-ios