Swift泛型方法应该使用重载泛型函数

时间:2015-04-18 12:59:38

标签: swift generics overloading

我无法使用Swift泛型获得所需的效果。我定义了一些通用函数,但是对于特定情况,我想覆盖它们以提供其他功能。当我从非泛型方法/函数调用函数时,一切正常(它在参数类型匹配时使用特定版本,否则使用泛型版本),但是当我从泛型方法/函数调用函数时,它总是使用泛型功能的版本(从不特定版本)。

这是一个示例游乐场:

func printSomething <T> (something: T) {
    println("This is using the generic version.")
    println(something)
}

func printSomething(string: String) {
    println("This is using the specific version.")
    println(string)
}

func printSomeMoreThings <T> (something: T) {
    printSomething(something)
}

class TestClass <T> {

    var something: T

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

    func printIt() {
        printSomething(self.something)
    }
}

printSomething("a")
println()
printSomeMoreThings("b")

let test = TestClass(something: "c")
println()
test.printIt()

这给出了以下输出:

This is using the specific version.
a

This is using the generic version.
b

This is using the generic version.
c

我希望它始终使用特定版本(因为它一直使用String参数调用printSomething)。有没有办法在不使用特定String版本重载每个方法/函数的情况下执行此操作。特别是对于Class的情况,因为我不能为特定类型的T?

重载类方法

1 个答案:

答案 0 :(得分:3)

由于您自己提到的原因(目前无法为特定类型的<T>重载实例/类方法),目前无法实现此目的。

但是,您可以在运行时检查类型并执行相应操作,而不是使用函数重载:

func printSomething<T>(something: T)
{
    if let somestring = something as? String
    {
        println("This is using the specific version.")
        println(somestring)

        return
    }

    println("This is using the generic version.")
    println(something)
}

除非您将此功能调用数千次,否则对性能的影响应该可以忽略不计。