一尘不染

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

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

错误 Could not find an overload for '>' that accepts the supplied arguments

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


阅读 236

收藏
2020-07-07

共1个答案

一尘不染

自由函数的替代解决方案是执行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
2020-07-07