2016-03-04 73 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 
相關問題