我正在创建一个排序的集合类型,它通常从序列和闭包中初始化(这样我就可以对任何类型的元素进行排序)。但是,我也希望在元素类型为ArrayLiteralConvertible
的情况下将其设为Comparable
,但我还不完全确定最佳方法吗?
即元素为Comparable
时,不需要闭包(只要升序顺利)。
只有当元素类型为ArrayLiteralConvertible
时,类型才可能为Comparable
吗?如果没有,最好的选择是什么(前提条件失败?)
答案 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