我意识到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")
}
答案 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版本。由于编译器会将泛型专门化,所有的演员都可能会消失。
根据具体情况,您可以使用具有关联类型约束的协议扩展来解决此问题。