使泛型类的函数只接受相同泛型类型但更受约束的参数

时间:2014-10-02 16:34:15

标签: swift generics

我有一个generic类,可以初始化为任何类型。我想添加一个带有单个参数的函数,该函数获取的类都是类的泛型类型,并且符合Comparable协议。类型一致性应该在编译前强制执行。

我想做这样的事情:

class Object<T> {

    let value: T!

    init (value: T) {
        self.value = value
    }

    func doSomething<U where U: Comparable, U == T>(otherValue: U) {
        // do something
    }
}

这可能吗?

2 个答案:

答案 0 :(得分:4)

不幸的是,没有。您无法在方法中进一步专门化泛型类型 - 您需要为所需的行为添加顶级函数。

这是Array没有纯myArray.sort()函数的原因,因为无法保证任何Array实例的成员都是Comparable。相反,这个签名有一个顶级函数:

func sort<T : Comparable>(inout array: [T])

您的顶级功能将具有类似的结构:

func doSomething<T: Comparable)(obj: Object<T>, otherValue: T) {
    // ...
}

答案 1 :(得分:3)

作为参考,这是可能的,因为 Swift 2.0

extension Object where T : Comparable {
    func doSomething(otherValue: T) {
        // do something
    }
}