首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >扩展Array以检查它是否在Swift中排序?

扩展Array以检查它是否在Swift中排序?
EN

Stack Overflow用户
提问于 2014-07-07 11:17:51
回答 12查看 14.3K关注 0票数 25

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

我目前在Playground中的实现

代码语言:javascript
运行
复制
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中实现此扩展?还是我做错了什么?

EN

Stack Overflow用户

发布于 2016-09-09 18:49:30

对我来说,最灵活的解决方案是NSAddict和Wes Campaigne的答案的组合。即结合了能够扩展协议和将比较器函数作为自变量传递的优点。这消除了仅将其与数组一起使用以及将其约束为符合Comparable协议的元素的限制。

代码语言:javascript
运行
复制
extension CollectionType
{
    func isSorted(isOrderedBefore: (Generator.Element, Generator.Element) -> Bool) -> Bool
    {
        var previousIndex = startIndex
        var currentIndex = startIndex.successor()

        while currentIndex != endIndex
        {
            if isOrderedBefore(self[previousIndex], self[currentIndex]) == false
            {
                return false
            }

            previousIndex = currentIndex
            currentIndex = currentIndex.successor()
        }

        return true
    }
}

这可以在任何Collection类型上使用,并且可以根据需要定义排序标准。

票数 1
EN
查看全部 12 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24602595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档