Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Funções da classe tableView não funcionam

A classe demonstrada abaixo apresenta vários erros no Xcode e a IDE sugere colocar um "_" antes do primeiro parâmetro de cada função, creio que seja uma incompatibilidade da versão do swift.

//
//  MealTableViewController.swift
//  daily-meal
//
//  Created by Renan Ribeiro Brando on 23/10/16.
//  Copyright © 2016 Renan Ribeiro Brando. All rights reserved.
//

import UIKit


class MealsTableViewController: UITableViewController {

    var meals = [ Meal(name: "Eggplant brownie", happiness: 5),
                  Meal(name: "Zucchini Muffin", happiness: 3)]


    override func tableView(tableView: UITableView,
                            numberOfRowsInSection section: Int) -> Int {
        return meals.count
    }


    override func tableView(tableView: UITableView,
                            cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let row = indexPath.row
        let meal = meals[ row ]

        var cell = UITableViewCell(style: UITableViewCellStyle.Default,
                                   reuseIdentifier: nil)
        cell.textLabel.text = meal.name
        return cell
    }



}
2 respostas
solução!

Fala aí Renan tudo bom?

Realmente isso é uma incompatibilidade com a versão do Swift.

Para você entender o porque você de ter que colocar _ antes do primeiro parâmetro dos métodos.

Swift tem funcionalidades que foram herdadas do Objective-C.

Uma dessas funcionalidades é Arguments Label. Essa funcionalidade nos permite criar labels para os argumentos dos métodos (deixando-o assim bem mais expressivo). Exemplo:

func pessoa(comNome firstName: String, eSobreNome lastName: String) {
    // Dentro do método me refiro ao primeiro argumento através do nome "firstName".    
    // E ao segundo argumento através do nome "lastName".

    print("Pessoa: \(firstName) \(lastName)")
}

Porém para invocar esse método utilizo a seguinte expressão: pessoa(comNome: "Fernando", eSobreNome:"Furtado").

Até a versão 2 do swift você podia ter argumentos com labels ou sem labels no mesmo método.

Como era o caso do método :

override func tableView(tableView: UITableView,
  cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { }

Onde o primeiro argumento dele não tinha label.

Porém agora na versão 3 do swift ou todos os argumentos tem labels ou nenhum tem. E para manter a compatibilidade com o legado, os métodos que misturavam o uso de argumentos com labels e sem labels você deve usar o recurso de omissão de labels com _ antes dos argumentos que não possuem labels.

Com isso a assinatura do método tableview:cellForRowAtIndexPath ficou assim:

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

Você pode notar também que o tipo do argumento indexPath foi renomeado removendo o prefixo NS ( NSIndexPath-> IndexPath).

Consulte: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

https://swift.org/migration-guide/

Espero ter ajudado.

Muito obrigado pela esclarecimento, consegui entender o conceito dos labels utilizados agora. A classe do viewcontroller do exercício do capitulo I do curso Swift II ficou da seguinte forma em Swift 3

import UIKit

class MealsTableViewController: UITableViewController {

    let meals = [ "eggplant brownie", "zucchini muffin" ]

    override func viewDidLoad() {
        super.viewDidLoad()
        print("view did load")
    }

    override func tableView(_ tableView: UITableView,
                            numberOfRowsInSection section: Int) -> Int {
        return meals.count
    }

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

}