arrays - 扩展数组以检查它是否在 Swift 中排序?

标签 arrays swift

我想扩展 Array 类,以便它可以知道它是否已排序(升序)。我想添加一个名为 isSorted 的计算属性。如何声明数组的元素具有可比性?

我目前在 Playground 中的实现

extension Array {
  var isSorted: Bool {
    for i in 1..self.count {
      if self[i-1] > self[i] { return false }
    }
    return true
  }
}

// The way I want to get the computed property
[1, 1, 2, 3, 4, 5, 6, 7, 8].isSorted //= true
[2, 1, 3, 8, 5, 6, 7, 4, 8].isSorted //= false

错误 找不到接受所提供参数的“>”的重载

当然,我仍然得到一个错误,因为 Swift 不知道如何比较元素。如何在 Swift 中实现此扩展?还是我在这里做错了什么?

最佳答案

自由函数的替代解决方案是执行 Swift 的内置 Array.sortArray.sorted 方法所做的事情,并要求您传递一个合适的比较器方法:

extension Array {
    func isSorted(isOrderedBefore: (T, T) -> Bool) -> Bool {
        for i in 1..<self.count {
            if !isOrderedBefore(self[i-1], self[i]) {
                return false
            }
        }
        return true
    }
}

[1, 5, 3].isSorted(<) // false
[1, 5, 10].isSorted(<) // true
[3.5, 2.1, -5.4].isSorted(>) // true

关于arrays - 扩展数组以检查它是否在 Swift 中排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24602595/

相关文章:

ios - 向下滚动和向上滚动后 UITableViewCell 中的图像发生变化

arrays - 通过在函数内部采购创建的 bash 数组具有局部作用域,但标量是全局的

c++ - 在 C++ 中将 3d 数组转换为 2d 数组

swift - 如何使用 UISwipeGestureRecognizer 重新加载具有传递数据的同一 View Controller

iOS 开发者计划证书转移

Swift Decodable,Endpoint返回完全不同的类型

PHP 数组 : integer index vs string index

python - Python 中的二进制搜索

java - 获取单词搜索生成器的单词输入列表

ios - 如何在 Swift 3 的 Table Cell 中设置多行 UILabel?