Stimmt diese Funktion? Rufen Sie eine Funktion mit Abschluss auf (swift – iOS)
Posted: 16 Jan 2025, 10:53
Das Problem
Ich muss einen Film auf der API suchen und auf meinem Tisch die gesuchten Filme ansehen.
Sprache
Swift 3 - xcode 8
Funktion zum Abrufen von Json von der API
Diese Klasse namens Movie (die auf der API durchsucht wird):
Und dann mein DAO:
Was ist ein Abschluss und was würde passieren, wenn ich ihn nicht in diesen Funktionen verwende?
Wie kann ich diese Funktion nun testen? Ich nenne es in meinem AppDelegate wie folgt:
Aber der Xcode gibt einen Fehler zurück, der besagt, dass im Aufruf ein Parameter fehlt. Können Sie mir das erklären? Ich habe darüber gelesen, aber ich bin ein Anfänger und es verwirrt mich immer noch.
Oh, ich möchte ein Array mit dem gesuchten Titel drucken. Ich bin mir fast sicher, dass meine Funktion das nicht zurückgibt. Wie kann ich die Funktion dafür anpassen?
Zum besseren Verständnis stellt die API diesen JSON-Code für den gesuchten Film bereit:
Update 1:
Mir gefiel der Vorschlag und ich rief (auf meinem AppDelegate an, nur zum Testen und Ansehen Wenn es das bekommt, was ich will, in diesem Fall eine Liste der Filme, die das „arq“ im Titel enthalten), sieht meine Funktion wie folgt aus:
Die Rückgabe war dieser Fehler:

Was stimmt mit dieser grünen Zeile nicht?
Ich muss einen Film auf der API suchen und auf meinem Tisch die gesuchten Filme ansehen.
Sprache
Swift 3 - xcode 8
Funktion zum Abrufen von Json von der API
Code: Select all
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)
}
}
//------------------------------------------------
Code: Select all
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 }
}
}
Code: Select all
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)
}
}
})
}
}
Wie kann ich diese Funktion nun testen? Ich nenne es in meinem AppDelegate wie folgt:
Code: Select all
print(MovieDAO.getMovies(imdbTitle: "arq"))
Oh, ich möchte ein Array mit dem gesuchten Titel drucken. Ich bin mir fast sicher, dass meine Funktion das nicht zurückgibt. Wie kann ich die Funktion dafür anpassen?
Zum besseren Verständnis stellt die API diesen JSON-Code für den gesuchten Film bereit:
Code: Select all
{
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;
}
Mir gefiel der Vorschlag und ich rief (auf meinem AppDelegate an, nur zum Testen und Ansehen Wenn es das bekommt, was ich will, in diesem Fall eine Liste der Filme, die das „arq“ im Titel enthalten), sieht meine Funktion wie folgt aus:
Code: Select all
MovieDAO.getMovies(imdbTitle: "arq") {
(movies: [Movie]) in
// Do something with the movies
print(movies)
}
Was stimmt mit dieser grünen Zeile nicht?