扩展数组以检查它是否在 Swift 中排序? [英] Extending Array to check if it is sorted in Swift?

查看:26
本文介绍了扩展数组以检查它是否在 Swift 中排序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to extend Array class so that it can know whether it is sorted (ascending) or not. I want to add a computed property called isSorted. How can I state the elements of the Array to be comparable?

我目前在 Playground 中的实现

My current implementation in 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 中实现这个扩展?还是我在这里做错了什么?

Of course, I still got an error because Swift doesn't know how to compare the elements. How can I implement this extension in Swift? Or am I doing something wrong here?

推荐答案

自由函数的替代解决方案是执行 Swift 内置的 Array.sortArray.sorted 方法可以,并且需要您将合适的比较器传递给该方法:

The alternative solution to a free function is to do what Swift's built-in Array.sort and Array.sorted methods do, and require that you pass a suitable comparator to the method:

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

这篇关于扩展数组以检查它是否在 Swift 中排序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆