Classificando itens JSON de um site

Sep 12 2020

Então, recentemente me candidatei a este trabalho para desenvolvedor iOS e fui convidado a completar o seguinte desafio de código:

Como próxima etapa, conclua este exercício de codificação para prosseguir com nosso processo de entrevista. Se você se sair bem e passar, será conectado a um engenheiro de software para discutir seu exercício para uma vídeo chamada com zoom de uma hora. Demore o tempo que for necessário.

Declaração do problema:

Escreva um aplicativo (Android / iOS) que recupere os dados de https://fetch-hiring.s3.amazonaws.com/hiring.json. Isso retornará uma matriz json de itens. Usando essa lista de itens, exiba todos os itens agrupados por "listId" na IU. Classifique os resultados primeiro por "listId" e depois por "nome" ao exibir. Filtre quaisquer itens em que "nome" esteja em branco ou nulo. O resultado final deve ser exibido para o usuário em uma lista fácil de ler. "

Minha solução está aqui .

O View Controller é o seguinte:

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

}


}

Dois dias após o envio, recebi o seguinte feedback:

O exercício apresentou muito código Swift que forçou o desempacotamento em vez de usar paradigmas de segurança nula, como let ou guard, e os itens exibidos na lista teriam se beneficiado de uma estrutura ou classe definindo o objeto para separar melhor a lógica de negócios da visualização controlador.

Eles estão sendo muito exigentes aqui, ou meu código está realmente tão bagunçado?

Respostas

3 Shadowrun Sep 18 2020 at 18:27

Eles não estão sendo muito exigentes. O manipulador de conclusão do DataTask retornará nil para dados quando não puder obtê-los, como quando a rede está offline. Forçar o desempacotamento de 'dados' significa que você travou deliberadamente o aplicativo quando isso acontece. Isso seria ruim.

"separe a lógica de negócios do controlador de visualização": eles esperam que você faça um tipo de dados para analisar o JSON, talvez assim:

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