如何从通用函数调用最精确的重载?

时间:2015-01-10 19:44:58

标签: generics swift

This guy说可以重载Swift泛型方法作为专门化它们的方法:

func testMethod<T: Comparable>(v: T) -> T {
    return v
}
func testMethod(v: Int) -> Int {
    return v * 12345
}

所以我试图得到一些类似的东西。我已经创建了一个类来从字节缓冲区读取整数。它特别定义了这些方法:

public func read(type: Int32.Type) -> Int32 {
    return /* implementation detail */
}

public func read<T: IntegerType>(type: T.Type) -> T {
    let bug: T! = nil
    return bug
}

public func readInto<T: IntegerType>(inout into: T) {
    into = read(T.self)
}

还有更多read(type: [U]Int[bits])方法来重载read<T>方法。如果我尝试从非泛型实现未涵盖的类型中读取,则泛型方法意味着崩溃我的程序。

readInto方法是一种方便的方法,因此我不必重复对象的类型。如果我想要读取Int32变量,而不是variable = reader.read(type: Int32.self),我可以reader.read(&variable),因为我不想重复自己,我觉得这样更好。

我的问题是来自readInto的来电系统地转到了全能read<T>,即使存在更精确的过载。

有没有办法让它从泛型方法调用最精确的重载?

1 个答案:

答案 0 :(得分:1)

这不能解决一般问题,但Swift函数可以从返回类型中重载。例如:

func foo() -> Int16 {
    return 0
}

func foo() -> Int32 {
    return 1
}

let i16: Int16 = foo() // 0
let i32: Int32 = foo() // 1
let i = foo() // compile-time error: ambiguous

这实际上意味着我不需要readInto方法来读取给定类型的变量,我可以为其分配read()调用的结果并完成有了它,该死的是泛型。