swift - 函数和泛型

标签 swift swift2

我想在 swift 中实现“天真的”排序。我正在这样做:

extension Array {
    func sort<Element: Comparable>(isOrderedBefore: (Element, Element) -> Bool) -> [Element] {

        var sortedArray : [Element] = []
        for x in self {
            for (index, value) in sortedArray.enumerate() {
                if isOrderedBefore(x, value) {

                }
            }
        }
        return sortedArray
    }
}

我遇到编译错误:“无法使用参数列表 '(Element, Element) 调用 isOrderedBefore

如果删除 Comparable 协议(protocol),代码可以编译,但如果数组元素不具有可比性,我就无法实现排序功能。

此代码编译:

extension Array {
    func sort(isOrderedBefore: (Element, Element) -> Bool) -> [Element] {

        var sortedArray : [Element] = []
        for x in self {
            for (index, value) in sortedArray.enumerate() {
                if isOrderedBefore(x, value) {

                }
            }
        }
        return sortedArray
    }
}

我做错了什么?

最佳答案

a) Array 符合 CollectionType 并间接符合 SequenceType b) 作为 SequenceType 的一部分,有默认的排序实现

extension SequenceType where Self.Generator.Element : Comparable {
    /// Return an `Array` containing the sorted elements of `source`.
    ///
    /// The sorting algorithm is not stable (can change the relative order of
    /// elements that compare equal).
    ///
    /// - Requires: The less-than operator (`func <`) defined in
    ///   the `Comparable` conformance is a
    ///   [strict weak ordering](http://en.wikipedia.org/wiki/Strict_weak_order#Strict_weak_orderings)
    ///   over the elements in `self`.
    @warn_unused_result
    public func sort() -> [Self.Generator.Element]
}

extension SequenceType {
    /// Return an `Array` containing the sorted elements of `source`
    /// according to `isOrderedBefore`.
    ///
    /// The sorting algorithm is not stable (can change the relative order of
    /// elements for which `isOrderedBefore` does not establish an order).
    ///
    /// - Requires: `isOrderedBefore` is a
    ///   [strict weak ordering](http://en.wikipedia.org/wiki/Strict_weak_order#Strict_weak_orderings)
    ///   over the elements in `self`.
    @warn_unused_result
    public func sort(@noescape isOrderedBefore: (Self.Generator.Element, Self.Generator.Element) -> Bool) -> [Self.Generator.Element]
}

因此,如果默认实现对您来说不够(如果您对比较相等的元素的顺序有一些特殊要求),您可以遵循相同的场景

extension SequenceType where Self.Generator.Element : Comparable {
    public func mySpecialSort() -> [Self.Generator.Element] {
      ... 
    }
}

和/或

extension SequenceType {
    public func mySpecialSort(@noescape isOrderedBefore: (Self.Generator.Element, Self.Generator.Element) -> Bool) -> [Self.Generator.Element] {
   ...
}

关于swift - 函数和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34433655/

相关文章:

swift - 将 swiftLint 添加到项目后运行 pod install 时出错

swift - OSX Cocoa NSCollectionViewFlowLayout 水平滚动缩放/放大不起作用

ios - 使用 swift 格式化 double 型字符串

ios - 使用泛型类型的 Swift 工厂

ios - CornerRadius 不设置

ios - Swift 中 SQLite 项目中的 UnsafePointer<Uint8> 问题

swift 2.1 : Realm query fails with new line character

json - Swift 代码出错不知道该写什么来返回?

ios - 如何在 swift2 中的 xcode 上一段时间后关闭相机界面并打开不同的 View Controller ?

objective-c - 如何将 Swift 代码导入 Objective-C?