使用闭包实现sortInPlace作为MutableCollectionType扩展

时间:2015-12-08 03:32:46

标签: arrays swift sorting

我尝试向Card数组添加两种方法,这样我就可以调用cardArray.suitSort()cardArray.rankSort()来执行具有相应比较功能的sortInPlace({})括号之间。但是,在编译下面的代码时,我得到了错误"对成员sortInPlace"的不明确的引用。无论我是否离开self.部分都会坚持下去。

extension MutableCollectionType where Generator.Element == Card {
    mutating func suitSort() {
        self.sortInPlace({SuitSorted($0,$1)})
    }
    mutating func rankSort() {
        self.sortInPlace({RankSorted($0,$1)})
    }
}

我怎样才能让它发挥作用,因此每次我想对sortInPlace({comparisonFunction($0,$1)})进行排序时,我都不必使用Array<Card>

1 个答案:

答案 0 :(得分:0)

我通过使用名为CardCollection的协议和与以下内容有些类似的代码解决了这个难题:

protocol CardCollection : RangeReplaceableCollectionType, CustomStringConvertible {
    var collective : [Card] { get set }
}

extension CardCollection  {
    mutating func shuffleInPlace() {
        collective.shuffleInPlace()
    }

    // This is where the generic sorter takes place
    mutating func sortInPlace(sortFun: (Card, Card) -> Bool?=DisplaySorted) {
        collective.sortInPlace({sortFun($0,$1)!})
    }

    mutating func sortBySuit() {
        sortInPlace(SuitSorted)
    }
    mutating func sortByRank() {
        sortInPlace(RankSorted)
    }
    mutating func sortForDisplay() {
        sortInPlace(DisplaySorted)
    }
}