swift - ArrayLiteralConvertible 仅当元素类型是 Comparable 时?

标签 swift protocols

我正在创建一个排序的集合类型,它通常从序列加闭包初始化(这样我就可以对任何类型的元素进行排序)。但是,在元素类型为 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/

相关文章:

ios - 如何使用 Swift 将照片库的最新照片添加到 uiimageview?

ios - Swift 2.2 泛型 : "Cannot convert return expression of type ItemPageControllerFactory to return type T"

http - 需要方案相对 url 说明

swift - 覆盖子子类中的协议(protocol)默认实现不参与动态调度

ios - 核心数据: bundle.main.url Thread 1 fatal error

ios - 如何在 iOS Swift 中获取实际的日期时间?即使用户从设备设置中更改了日期时间

swift - swift 中的选择器出现问题

swift - 如何在委托(delegate)协议(protocol)模式中使用相同的实例?

Swift - 如何获取从协议(protocol)扩展的类?

ios - UITabBarController 中的 moreNavigationController 始终为 nil