Sortowanie elementów JSON z witryny

Sep 12 2020

Więc ja niedawno zastosowane do tego zadania dla iOS Developer i został poproszony o wypełnienie kod następujące wyzwania:

W następnym kroku wykonaj to ćwiczenie z kodowania, aby kontynuować proces rozmowy kwalifikacyjnej. Jeśli wypadniesz dobrze i zdasz, zostaniesz połączony z inżynierem oprogramowania, aby omówić swoje ćwiczenie podczas godzinnej rozmowy wideo z zoomem. Poświęć tyle czasu, ile potrzeba.

Opis problemu:

Napisz aplikację (na Androida / iOS), która pobiera dane z https://fetch-hiring.s3.amazonaws.com/hiring.json. To zwróci tablicę json elementów. Korzystając z tej listy elementów, wyświetl wszystkie elementy pogrupowane według „listId” w interfejsie użytkownika. Podczas wyświetlania posortuj wyniki najpierw według „listId”, a następnie według „nazwy”. Odfiltruj wszystkie elementy, w których pole „nazwa” jest puste lub puste. Ostateczny wynik powinien zostać wyświetlony użytkownikowi w postaci łatwej do odczytania listy. "

Moje rozwiązanie jest tutaj .

Kontroler widoku jest następujący:

import UIKit



class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return tableData[section].count
}

@IBOutlet weak var dataTableView: UITableView!
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "DataViewCell", for: indexPath) as? DataCell
    cell?.textSpace.text=tableData[indexPath.section][tableIndices[indexPath.section][indexPath.row]]
    return cell!
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return "List ID: "+String(section+1)
}

func numberOfSections(in tableView: UITableView) -> Int {
    return tableData.count
}



var tableData: [[Int:String]]=[[:]]
var tableIndices: [[Int]]=[[]]

override func viewDidLoad() {
    super.viewDidLoad()
    
    
    URLSession.shared.dataTask(with: URL(string: "https://fetch-hiring.s3.amazonaws.com/hiring.json")!)
                 {
                     data,response,error  in
                     
                    
                    let json=try? JSONSerialization.jsonObject(with: data!, options: []) as! [[String:Any]]
                    
                    for items in json!
                    {
                        if(type(of: items["name"]!) != NSNull.self && items["name"]! as! String != "")
                        {
                            let listID=Int(String(describing: items["listId"]!))!
                          
                            while(self.tableData.count < listID)
                            {
                                self.tableData.append([:])
                                self.tableIndices.append([])
                            }
                            
                            self.tableIndices[listID-1].append(Int(String(describing: items["id"]!))!)
                            self.tableData[listID-1][Int(String(describing: items["id"]!))!       ]=items["name"]! as! String
                            self.tableIndices[listID-1].sort()
                            
                        }
                    }
                 
                     DispatchQueue.main.async {
                        self.dataTableView.delegate=self
                        self.dataTableView.dataSource=self
                        self.dataTableView.reloadData()
                         
                     }
            
                 }.resume()
                  

}


}

Dwa dni po przesłaniu otrzymałem następującą opinię:

Ćwiczenie zawierało wiele kodu Swift, który wymuszał rozpakowywanie zamiast stosowania zerowych bezpiecznych paradygmatów, takich jak let lub guard, a elementy wyświetlane na liście skorzystałyby na strukturze lub klasie definiującej obiekt, aby lepiej oddzielić logikę biznesową od widoku kontroler.

Czy są tu zbyt wybredni, czy też mój kod naprawdę się popsuł?

Odpowiedzi

3 Shadowrun Sep 18 2020 at 18:27

Nie są zbyt wybredni. Program obsługi zakończenia DataTask zwróci wartość nil dla danych, gdy nie może ich pobrać, na przykład gdy sieć jest offline. Wymuś rozpakowanie „danych” oznacza, że ​​w takim przypadku celowo zawieszasz aplikację. To byłoby złe.

„Oddziel logikę biznesową od kontrolera widoku”: oczekują, że utworzysz typ danych do przeanalizowania JSON, na przykład taki:

struct Item: Decodable {
    let id: Int
    let listId: Int
    let name: String?
}