2016-03-04 33 views
1

我创建了一个有序的集合类型,通常从一个序列加上闭包进行初始化(这样我可以对任何类型的元素进行排序)。但是,在元素类型为Comparable的情况下,我还想将其设置为ArrayLiteralConvertible,但是我不完全确定这样做的最佳方式?仅当元素类型为Comparable时ArrayLiteralConvertible?

即 - 当元素是Comparable时不需要闭包(只要升序很好)。

仅当其元素类型为Comparable时,类型可能为ArrayLiteralConvertible?如果不是,什么是最好的选择(前提失败?)

回答

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 
相关问题