在Swift中定义显式泛型方法

时间:2014-08-15 15:33:10

标签: c++ templates generics swift

在C ++中,我可以这样做:

class foo {
    template <class bar>
    bar baz() {
        return bar()
    }
}

但是当我在Swift中尝试这个时:

class Foo {
    func baz<Bar>() -> Bar {
        return Bar()
    }
}

我遇到语法错误,Swift不支持显式泛型方法专门化。

Swift中有没有类似的实现?

3 个答案:

答案 0 :(得分:3)

我不知道C ++中的代码到底是什么。但您可以使用Type Constraints

但是对我来说仍然没有意义,因为并非每个类都有构造函数,在Swift中没有参数。所以我提出了这个代码,但我不确定这是否有帮助:

protocol TypeWithEmptyConstructor {
    init()
}

class SomeClass {
    required init() {
    }
}

extension SomeClass: TypeWithEmptyConstructor { }

class Foo {
    func baz<Bar: TypeWithEmptyConstructor>() -> Bar {
        return Bar()
    }
}

答案 1 :(得分:0)

我知道这是一个老帖子,但我遇到了同样的问题。我找到的解决方案是创建一个虚拟类,其实例传递给我的函数(类似于C ++重载)。

console.log(this["myVar" + (i+1) + "a");
console.log(this["myVar" + (i+1) + "b");

并将该函数调用为

// the dummy class
class Type2Type<T> {
    typealias type = T
}

// the generic function
func myFunction<T>(Type2Type<T>) {
    //do stuff here
}    

希望它有所帮助。

答案 2 :(得分:-1)

我从来都不是Swift专家,但如果你不能在编译时专攻,那么你必须专注于运行时。 Swift确实有一些反射功能,所以尝试类似:

class Foo {
    func baz<T>() -> T {
        if(T.Type == Bar) {
            doOneThing()
        } else {
            doTheOtherThing()
        }
    }
}

该代码未经测试,可能无效。祝你好运。