Swift泛型和专业化

时间:2017-07-10 21:47:30

标签: swift generics

我意识到Swift泛型不像C ++模板,其中代码是专门的并且在实例化时生成,但有没有办法获得以下代码来专门化第二个调用?

func X1<R>(i: R) {
    print("R")
}

func X1(i: Int) {
    print("Int")
}

func X2<R>(i: R) {
    X1(i: i)
}

X2(i: "s")
X2(i: 1)
X1(i: "s")
X1(i: 1)

特别是,我看到的输出是:

R
R
R
Int

但我真的希望X1 for X1的X2调用专门用于X1 Int:

R
Int
R
Int

我知道我可以通过创建另一个以Int作为类型的X2来实现,但我希望避免这种情况。

编辑一些答案​​建议为每种特殊类型添加处理(即添加func X2(i: Int)或执行类型转换let x = i as? Int) - 这就是我正在尝试的避免,因为可能有很多专门的类型,例如:

func X1(i: Double) {
    print("Double")
}

func X1(i: Bool) {
    print("Bool")
}

func X1(i: Float) {
    print("Float")
}

2 个答案:

答案 0 :(得分:0)

我只是通过将X2专门用于Int类型来实现它:

func X1<R>(i: R) {
    print("Any")
}
func X1(i: Int) {
    print("Int")
}

func X2<R>(i: R) {
    X1(i: i)
}
func X2(i: Int) {
    X1(i: i)
}

X2(i: "s")
X2(i: 1)
X1(i: "s")
X1(i: 1)

答案 1 :(得分:-1)

您可以尝试在X2中投射R:

func X2<R>(i: R) { 
   if let x = i as? Int { 
       X1(i: x) 
   } else { 
       X1(i: i) 
   } 
}

这将强制调用X1的Int版本。由于编译器会将泛型专门化,所有的演员都可能会消失。

根据具体情况,您可以使用具有关联类型约束的协议扩展来解决此问题。