如何检查IndexPath是否有效?

Lir*_*rik 5 nsindexpath ios swift swift3 indexpath

在swift 3之前,我习惯使用例如:

let path = self.tableView.indexPathForSelectedRow
if (path != NSNotFound) {
//do something
 }
Run Code Online (Sandbox Code Playgroud)

但是现在,因为我IndexPath在swift3中使用了类,所以我正在寻找等价的 path != NSNotFound支票.

Xcode8.3.1编译器错误: "二进制运算符'!='不能应用于'IndexPath'和'Int'类型的操作数"

ozg*_*gur 10

从语义上讲,要将indexPath视为无效,您需要检查一些内容,例如表视图或集合视图.

通常,如果indexPath表示数据源中没有相应数据的行,则可以认为它是无效的.(一个例外是"加载更多"行.)

如果你真的需要创建一个无效的IndexPath,你可以这样做:

let invalidIndexPath = IndexPath(row: NSNotFound, section: NSNotFound)
Run Code Online (Sandbox Code Playgroud)

更新后:

self.tableView.indexPathForSelectedRownil如果没有选定的行,则返回一个Optional .

if let path = tableView.indexPathForSelectedRow {
  // There is a selected row, so path is not nil.
}
else {
  // No row is selected.
}
Run Code Online (Sandbox Code Playgroud)

总之,比较path反对NSNotFound提高在所有情况下的例外.


pab*_*ros 5

要检查是否IndexPath存在,我使用以下扩展功能:

import UIKit

extension UITableView {

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

并使用它来做这样的事情:

if tableView.hasRowAtIndexPath(indexPath: indexPath as NSIndexPath) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)