web-dev-qa-db-fra.com

NSIndexPath? n'a pas d'erreur de nom de ligne 'row' dans Swift

Je crée un UITableViewController avec le langage Swift et dans une méthode

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

Je reçois cette erreur

NSIndexPath? n'a pas d'erreur de nom de ligne 'row' dans Swift 

et je ne comprends pas pourquoi.

C'est mon code

import UIKit

class DPBPlainTableViewController: UITableViewController {

    var dataStore: NSArray = NSArray()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.dataStore = ["one","two","three"]

        println(self.dataStore)
    }


    // #pragma mark - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {

        // Return the number of sections.
        return 1
    }

    override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {

        // Return the number of rows in the section.
        return self.dataStore.count
    }


    override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")

        cell.textLabel.text = self.dataStore[indexPath.row]

        return cell
    }

}

Ensuite, comment définir le cell.text avec l’élément array dataStore?

19
dpbataller

Vous pouvez décompresser le paramètre optionnel indexPath avec if let...:

if let row = indexPath?.row {
    cell.textLabel.text = self.dataStore[row]
}

ou si vous êtes sûr que indexPath n'est pas nil, vous pouvez forcer le décompression avec !:

cell.textLabel.text = self.dataStore[indexPath!.row]

Gardez simplement à l’esprit que indexPath! sur une valeur nulle sera une exception d’exécution, il est donc préférable de la décompresser comme dans le premier exemple.

15
Nate Cook

Vous pouvez utiliser la syntaxe de chaînage facultative pour cet appel (en définissant cell.textLabel.text sur nil si indexPath est nil):

cell.textLabel.text = indexPath? ? self.dataStore[indexPath!.row] : nil

ou décompressez-le explicitement (provoquant une erreur d'exécution si indexPath est nil):

cell.textLabel.text = self.dataStore[indexPath!.row]

ou utilisez la syntaxe plus verbeuse if let proposée par @NateCook.

5
ipmcc

Utilisez .item au lieu de .row

cell.textLabel.text = self.dataStore[indexPath.item]

0
Akshay Phulare