【问题标题】:Sort indexPathsForSelectedRows in Swift在 Swift 中对 indexPathsForSelectedRows 进行排序
【发布时间】:2014-10-03 16:52:36
【问题描述】:

当您调用 tableView.indexPathsForSelectedRows() 时,它会返回一个 AnyObject 类型的数组,其中包含按用户选择它们的顺序选择的行的 indexPaths。

我想要的是对 indexPaths 进行排序以获得升序。在 Swift 之前,可以这样实现:

NSArray *sortedIndexPaths = [[tableView indexPathsforSelectedRows]
sortedArrayUsingSelector:@selector(compare:)];

但我尝试用 Swift 实现它,但它不起作用:S

有人知道怎么处理吗?

提前致谢!

【问题讨论】:

    标签: objective-c swift tableview


    【解决方案1】:

    这是对存储在 paths 变量中的 NSIndexPath 对象数组进行排序的简单代码。 诀窍在于转换为 [NSIndexPath]。现在您可以对数组进行排序了。

    let paths = tableView.indexPathsForSelectedRows() as [NSIndexPath]
    let sortedArray = paths.sorted {$0.row < $1.row}
    

    或 如果您希望有单独的功能,例如:

    func compare (obj0: NSIndexPath, obj1: NSIndexPath) -> Bool {
     return obj0.row < obj1.row
    }
    

    然后

    let sortedArray = paths.sorted { compare($0, $1) }
    

    【讨论】:

    • 你不需要强制转换。 IndexPath 实现了 Comparable 协议,所以你可以简单地:tableView.indexPathsForSelectedRows.sorted().
    • 是的,注意:答案是 6 年前针对 Swift 1.0 发布的
    【解决方案2】:

    我目前在 Windows 7 上,所以我无法测试,但这是我期望的工作。它可能需要一个类型注释。

    let paths = tableView.indexPathsforSelectedRows()
    let sorted = paths.sortedArrayUsingSelector("compare:")
    

    【讨论】:

    • 不,它不起作用。我之前试过这个没有成功。错误:[AnyObject]?没有名为“sortedArrayUsingSelector”的成员
    • 那是因为路径是可选的,请参阅 Allen Zeng 的回答 RE: using a guard statement。
    【解决方案3】:

    您可以重载 &lt;&gt; 运算符,然后对其调用 sort。

    全局定义

    func <(left: NSIndexPath, right: NSIndexPath) -> Bool {
        return left.section < right.section || left.row < right.row
    }
    

    那么你可以这样做来提升

    let sortedIndexPaths = tableView.indexPathsForSelectedRows?.sort(<)
    

    显然因为它返回一个可选的,你会以某种方式防范它,例如

    guard let sortedIndexPaths = tableView.indexPathsForSelectedRows?.sort(<) else {
        return
    }
    

    【讨论】:

      【解决方案4】:

      这里是排序 indexPathsForSelectedRows swift 4 代码。

          if var selection = tableView.indexPathsForSelectedRows
          {
             selection = selection.sorted{ $1.compare($0) == .orderedAscending }
      
          }
      

      如果您有任何问题请联系我。

      【讨论】:

        猜你喜欢
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        相关资源
        最近更新 更多