Trier les éléments JSON d'un site

Sep 12 2020

J'ai donc récemment postulé à ce poste pour iOS Developer et j'ai été invité à relever le défi de code suivant:

Comme étape suivante, veuillez compléter cet exercice de codage afin de poursuivre notre processus d'entrevue. Si vous réussissez bien et réussissez, vous serez connecté à un ingénieur logiciel pour discuter de votre exercice pendant un appel vidéo avec zoom d'une heure. Prenez autant de temps que nécessaire.

Énoncé du problème:

Veuillez écrire une application (Android / iOS) qui récupère les données de https://fetch-hiring.s3.amazonaws.com/hiring.json. Cela renverra un tableau d'éléments json. À l'aide de cette liste d'éléments, affichez tous les éléments regroupés par "listId" dans l'interface utilisateur. Triez les résultats d'abord par "listId" puis par "nom" lors de l'affichage. Filtrez tous les éléments où «nom» est vide ou nul. Le résultat final doit être affiché à l'utilisateur dans une liste facile à lire. "

Ma solution est ici .

View Controller est le suivant:

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()
                  

}


}

Deux jours après la soumission, j'ai reçu les commentaires suivants:

L'exercice comportait beaucoup de code Swift qui a forcé le déballage au lieu d'utiliser des paradigmes de sécurité nil tels que let ou guard, et les éléments affichés dans la liste auraient bénéficié d'une structure ou d'une classe définissant l'objet pour mieux séparer la logique métier de la vue. manette.

Sont-ils trop pointilleux ici, ou mon code est-il vraiment foutu?

Réponses

3 Shadowrun Sep 18 2020 at 18:27

Ils ne sont pas trop pointilleux. Le gestionnaire d'achèvement de DataTask retournera nil pour les données lorsqu'il ne peut pas obtenir les données, comme lorsque le réseau est hors ligne. Forcer le déballage des «données» signifie que vous plantez délibérément l'application lorsque cela se produit. Ce serait mauvais.

"séparez la logique métier du contrôleur de vue": ils s'attendent à ce que vous créiez un type de données pour analyser le JSON, peut-être comme ceci:

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