私はしばらくの間、spoonacular API を使用してレシピを検索できるレシピ アプリを使用してきました。JSONデータを配列に正常に保存しましたが、ユーザーが何かを検索したときにデータをテーブルビューに取得する方法がわかりませんか? これまでの私のコードは次のとおりです。
JSON ファイルを取得してデータを読み取る方法:
Class APIRequest() {
static let instance = APIRequest()
var query:String = ""
var url: String = ""
var testString: String = ""
func setQuery(_ query: String) -> Void {
self.query = query
}
func getReturn(completed: @escaping (Result<Response, Error>) -> Void) {
// TODO MAJOR!
// Expressions are not allowed at top level will occur otherwise
//
let headers = [
"x-rapidapi-host": "spoonacular-recipe-food-nutrition-v1.p.rapidapi.com",
"x-rapidapi-key": "e44daac5e0mshc682df24497a89fp1c4513jsn7067934f0b9b"
]
var request = URLRequest(url: URL(string: "https://spoonacular-recipe-food-nutrition-v1.p.rapidapi.com/recipes/search?number=2&query=\(query)")!,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers
let session = URLSession.shared
let dataTask = session.dataTask(with: request) { (data, response, error) -> Void in
if let error = error { completed(.failure(error)); return }
do {
let result = try JSONDecoder().decode(Response.self, from: data!)
completed(.success(result))
} catch {
completed(.failure(error))
}
}
dataTask.resume()
}
私のレシピクラス:
class Recipe: Codable {
let id: Int
let image: String
let title: String
let readyInMinutes: Int
init(id: Int, image: String = "Default", title: String = "Title", readyInMinutes: Int) {
self.id = id
self.image = image
self.title = title
self.readyInMinutes = readyInMinutes
}
}
レシピハンドラー:
class RecipeHandler {
static let instance = RecipeHandler()
var allRecipeResults: [Recipe] = []
}
それから、私は確信が持てないこの応答構造体を持っています:
struct Response: Codable {
struct Result: Codable {
let id: Int
let title: String
let image: String
let readyInMinutes: Int
}
let results: [Result]
}
そして私の RecipeViewController:
class RecipeViewController: UITableViewController {
@IBOutlet var recipeTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
recipeTable.delegate = self
recipeTable.dataSource = self
}
}
//MARK: - Add cell
extension RecipeViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return RecipeHandler.instance.allRecipeResults.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "RecipeCell") as? RecipeTableViewCell{
let recipeItem = RecipeHandler.instance.allRecipeResults[indexPath.row]
cell.recipeImage.image = UIImage(named: recipeItem.image)
cell.recipeTitle.text = recipeItem.title
cell.recipeTime.text = "\(recipeItem.readyInMinutes)"
return cell
}
return UITableViewCell()
}
}
//MARK: - SearchBarSearchButtinClicked
extension RecipeViewController: UISearchBarDelegate{
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
guard let searchBarText = searchBar.text else {return}
let request = APIRequest.instance
request.query = searchBarText
request.getReturn { result in
switch result {
case .success(let result):
print(result.results)
//Don't know what to do here?
case .failure(let error):
print(error)
}
}
}
}