2017-04-25 3 views
3

Avant rapide 3, je l'habitude d'utiliser par exemple:Comment vérifier si IndexPath est valide?

let path = self.tableView.indexPathForSelectedRow 
if (path != NSNotFound) { 
//do something 
} 

Mais maintenant, depuis que je l'utilise IndexPath classe swift3, je cherche l'équivalent pour le contrôle path != NSNotFound.

erreur du compilateur Xcode8.3.1:" '! =' Opérateur binaire ne peut pas être appliqué aux opérandes de type 'indexPath' et 'Int'"

+3

Pourquoi voudriez-vous vérifier comme ça? Il n'y a aucun moyen que le code fonctionne tel quel car vous ne pouvez pas comparer 'NSIndexPath' avec' NSNotFound'. – rmaddy

+1

L'initialiseur NSIndexPath crée simplement un objet. De quelle manière pensez-vous initialiser un NSIndexPath où il est 'NotFound'? Ce n'est pas une requête. Vous pourriez le mélanger avec 'indexOf', qui renvoie un optionnel qui peut être vérifié pour zéro. – bauerMusic

+0

@bauerMusic, c'était juste un mauvais exemple. Je parlais plus de méthodes qui retournent IndexPath. Cela aurait été un meilleur exemple;) a mis à jour la question – Lirik

Répondre

8

sémantiquement, d'envisager une indexPath invalide, vous avez besoin de quelque chose à vérifier comme une vue de table ou une vue de collection.

Habituellement, vous pouvez considérer un indexPath invalide s'il représente une ligne où il n'y a pas de données correspondantes dans la source de données. (. Une exception serait "Charger plus" lignes)

Si vous avez vraiment besoin de créer un IndexPath non valide, vous pouvez le faire:

let invalidIndexPath = IndexPath(row: NSNotFound, section: NSNotFound) 

Après la mise à jour:

self.tableView.indexPathForSelectedRow renvoie un optionnel donc peut être nil s'il n'y a pas de ligne sélectionnée.

if let path = tableView.indexPathForSelectedRow { 
    // There is a selected row, so path is not nil. 
} 
else { 
    // No row is selected. 
} 

Quoi qu'il en soit, la comparaison path contre NSNotFound déclenche une exception dans tous les cas.

+0

Désolé, mon exemple n'était pas clair. mis à jour l'exemple. je faisais référence aux méthodes qui retournent un indexPath. – Lirik

+0

Merci. ça a du sens. – Lirik

2

Pour vérifier si IndexPath existe, j'utilise cette fonction d'extension:

import UIKit 

extension UITableView { 

    func hasRowAtIndexPath(indexPath: NSIndexPath) -> Bool { 
     return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section) 
    } 
} 

Et pour l'utiliser je fais quelque chose comme ceci:

if tableView.hasRowAtIndexPath(indexPath: indexPath as NSIndexPath) { 
    // do something 
}