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?
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.
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.
Utilisez .item au lieu de .row
cell.textLabel.text = self.dataStore[indexPath.item]