Эта функция правильная? Вызов функции с замыканием (swift — iOS)IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Эта функция правильная? Вызов функции с замыканием (swift — iOS)

Сообщение Anonymous »

Проблема

Мне нужно выполнить поиск фильма по 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)
}
}
//------------------------------------------------
Этот класс под названием Movie (поиск которого будет осуществляться через API):

Код: Выделить всё

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 }

}
}
И затем, мой DAO:

Код: Выделить всё

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"))
Но xcode возвращает ошибку, сообщающую, что в вызове отсутствует параметр. Так ты можешь мне это объяснить? Я читал об этом, но я новичок, и меня это все еще сбивает с толку.

О, я хотел бы напечатать массив с искомым заголовком. Я почти уверен, что моя функция этого не возвращает. Как я могу адаптировать функцию для этого?

Для лучшего понимания 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;
}
Обновление 1:

Мне понравилось это предложение, и я позвонил (в свой AppDelegate, просто для проверки и просмотра). если он получает то, что хочу, в данном случае список фильмов, содержащих «arq» в названии) моя функция такая:

Код: Выделить всё

MovieDAO.getMovies(imdbTitle: "arq") {
(movies: [Movie]) in
// Do something with the movies
print(movies)
}
Возврат был такой ошибкой:
Изображение


Что не так с этой зеленой линией?

Подробнее здесь: https://stackoverflow.com/questions/434 ... -swift-ios
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»