ArrayLiteralConvertible仅当元素类型是Comparable时?

时间:2016-03-04 12:42:35

标签: swift protocols

我正在创建一个排序的集合类型,它通常从序列和闭包中初始化(这样我就可以对任何类型的元素进行排序)。但是,我也希望在元素类型为ArrayLiteralConvertible的情况下将其设为Comparable,但我还不完全确定最佳方法吗?

即元素为Comparable时,不需要闭包(只要升序顺利)。

只有当元素类型为ArrayLiteralConvertible时,类型才可能为Comparable吗?如果没有,最好的选择是什么(前提条件失败?)

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

struct SortedCollection<T>: ArrayLiteralConvertible {
    init<S: SequenceType where S.Generator.Element == T>(_ sequence: S, isOrderedBefore: (T, T) -> Bool) {
        // ...
    }

    init(arrayLiteral elements: T...) {
        fatalError("\(T.self) is not Comparable")
    }
}

extension SortedCollection where T: Comparable {
    init<S: SequenceType where S.Generator.Element == T>(_ sequence: S) {
        self.init(sequence, isOrderedBefore: <)
    }

    init(arrayLiteral elements: T...) {
        self.init(elements)
    }
}

let foo = SortedCollection(arrayLiteral: 1, 2, 3)  //  Succeeds
let bar = SortedCollection(arrayLiteral: (1, 1), (2, 2), (3, 3))  //  Fails