Swift 3:按排序描述符排序(以前按类型排序)数组

时间:2016-06-16 11:15:12

标签: nstableview nssortdescriptor swift3

直到现在(Swift 2.2)我一直很高兴地使用来自this answer的代码 - 它很漂亮,它很优雅,它像梦一样工作。

extension MutableCollectionType where Index : RandomAccessIndexType, Generator.Element : AnyObject {
    /// Sort `self` in-place using criteria stored in a NSSortDescriptors array
    public mutating func sortInPlace(sortDescriptors theSortDescs: [NSSortDescriptor]) {
        sortInPlace {
            for sortDesc in theSortDescs {
                switch sortDesc.compareObject($0, toObject: $1) {
                case .OrderedAscending: return true
                case .OrderedDescending: return false
                case .OrderedSame: continue
                }
            }
            return false
        }
    }
}

extension SequenceType where Generator.Element : AnyObject {
    /// Return an `Array` containing the sorted elements of `source`
    /// using criteria stored in a NSSortDescriptors array.
    @warn_unused_result
    public func sort(sortDescriptors theSortDescs: [NSSortDescriptor]) -> [Self.Generator.Element] {
        return sort {
            for sortDesc in theSortDescs {
                switch sortDesc.compareObject($0, toObject: $1) {
                case .OrderedAscending: return true
                case .OrderedDescending: return false
                case .OrderedSame: continue
                }
            }
            return false
        }
    }
}

Swift 3改变了一切。

使用代码迁移工具和Proposal SE- 0006 - sort() => sorted(), sortInPlace() => sort() - 我已经达到了

extension MutableCollection where Index : Strideable, Iterator.Element : AnyObject {
    /// Sort `self` in-place using criteria stored in a NSSortDescriptors array
    public mutating func sort(sortDescriptors theSortDescs: [SortDescriptor]) {
        sort {
            for sortDesc in theSortDescs {
                switch sortDesc.compare($0, to: $1) {
                case .orderedAscending: return true
                case .orderedDescending: return false
                case .orderedSame: continue
                }
            }
            return false
        }
    }
}

extension Sequence where Iterator.Element : AnyObject {
    /// Return an `Array` containing the sorted elements of `source`
    /// using criteria stored in a NSSortDescriptors array.

    public func sorted(sortDescriptors theSortDescs: [SortDescriptor]) -> [Self.Iterator.Element] {
        return sorted {
            for sortDesc in theSortDescs {
                switch sortDesc.compare($0, to: $1) {
                case .orderedAscending: return true
                case .orderedDescending: return false
                case .orderedSame: continue
                }
            }
            return false
        }
    }
}

'sorted'函数编译[并且正常工作]没有问题。对于'sort',我在“sort”行上出现错误:“无法将类型'(_,_) - > _'的值转换为预期的参数类型'[SortDescriptor]'”,这让我感到非常困惑:我不知道编译器在哪里尝试转换任何东西,因为我传递的是SortDescriptors数组,它应该是一个SortDescriptors数组。

通常,这种类型的错误意味着你正在处理你应该有明确值的选项,但由于这是一个函数参数 - 而且似乎在func sorted中顺利工作 - 我只能阅读从中可以看出“出了问题”。截至目前,我不知道有什么东西,因为我们处于测试的早期阶段,根本就没有文档。

作为一种解决方法,我已从我的代码中删除了排序(以前的就地排序)功能,并将其替换为

的舞蹈

let sortedArray = oldArray(已排序[...] oldArray = sortedArray

但是如果我能够恢复原状排序功能,我将非常感激。

4 个答案:

答案 0 :(得分:1)

比较Swift 2.2中可用的方法:

enter image description here

使用Swift 3中的方法:

enter image description here

请注意,Swift 3没有接受sort闭包的isOrderedBefore方法。

这就是你的函数无法编译的原因。

这看起来像个bug,所以我在bugreport.apple.com上将其报告为错误26857748。

答案 1 :(得分:0)

let sortedArray = users.sorted {$ 0.name< $ 1.name}

答案 2 :(得分:0)

使用 RandomAccessCollection 协议

extension MutableCollection where Self : RandomAccessCollection {
    /// Sort `self` in-place using criteria stored in a NSSortDescriptors array
    public mutating func sort(sortDescriptors theSortDescs: [NSSortDescriptor]) {
        sort { by:
            for sortDesc in theSortDescs {
                switch sortDesc.compare($0, to: $1) {
                case .orderedAscending: return true
                case .orderedDescending: return false
                case .orderedSame: continue
                }
            }
            return false
        }
    }
}

答案 3 :(得分:0)

Swift 3.0

let sortedCapitalArray = yourArray.sorted {($0 as AnyObject).localizedCaseInsensitiveCompare(($1 as AnyObject)as! String) == ComparisonResult.orderedAscending}