我正在创建一个排序的集合类型,它通常从序列加闭包初始化(这样我就可以对任何类型的元素进行排序)。但是,在元素类型为 Comparable
的情况下,我也想将其设为 ArrayLiteralConvertible
,但我不确定最好的方法是什么?
即当元素是Comparable
时不需要闭包(只要升序没问题)。
仅当其元素类型为 Comparable
时,类型是否可能为 ArrayLiteralConvertible
?如果不是,最好的选择是什么(先决条件失败?)
最佳答案
你可以这样做:
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
关于swift - ArrayLiteralConvertible 仅当元素类型是 Comparable 时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35796386/