1
resposta

Gostaria de entender melhor como funciona esse bloco de codigo

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let row = indexPath.row
        let meal = meals[row]
        let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: nil)
        cell.textLabel!.text = meal.name
        return cell
    }
1 resposta
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let row = indexPath.row
    let meal = meals[row]
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: nil)
    cell.textLabel!.text = meal.name
    return cell
}

Quebrando o código linha por linha, temos:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

Aqui, o override func nos diz que estamos sobrescrevendo uma função chamada tableView(cellForRowAt:) que devolve um UITableViewCell.

No iOS, quando criamos uma função, podemos definir o nome que será usado internamente do argumento e seu nome que será visto por quem chamar. Veja:

func divide(numerador num1: Double, por num2: Double) -> Double {
    return num1/num2
}

Veja que internamente usamos num1 e num2. Porém, para chamar a função devemos usar os nomes externos dos argumentos, assim:

divide(numerador: 10, por: 3)

Vamos à segunda linha:

let row = indexPath.row

Recebemos esse indexPath como argumento da função que sobrescrevemos e esse argumento possui informações (como row e section) da linha que será construída pelo tableView. Como nosso tableView tem apenas uma section, só a row nos interessa. Guardamos numa constante chamada row.


    let meal = meals[row]

meals é um array. Como queremos colocar a refeição 0 na linha 0 do tableView (e assim por diante), usamos a nossa constante row como posição para buscar a refeição correspondente. Guardamos numa outra constante chamada meal.

Agora sabemos qual é a refeição (meal) que deverá ser exibida, mas ainda não temos o layout da linha que exibirá essa refeição.


    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: nil)

É justamente isso que é feito aqui: instanciamos uma linha (UITableViewCell) com um layout padrão do iOS (esse UITableViewCellStyle.default) e chamamos ela de cell. Neste momento, ela está em branco.


    cell.textLabel!.text = meal.name

Como essa cell foi instanciada com um layout padrão, ela já possui alguns campos prontos para serem populados. Um deles é chamado de textLabel que é só um UILabel comum.

Pegamos esse textLabel e setamos seu texto (.text) para ser o nome da refeição que deve aparecer na tela (meal.name).


Por fim, retornamos essa cell já populada e pronta para ser exibida na tela:

return cell