[英]Explicitly specialize a generic function is swift
我試圖使用泛型函數在swift類上調用靜態方法,因此我實際上並不需要類的類型成為函數簽名的一部分。
似乎找不到辦法。
這是我要執行的操作的C ++示例:
#include <iostream>
class A {
public:
static void f(){
std::cout << "A::f()" << std::endl;
}
};
class B {
public:
static void f(){
std::cout << "B::f()" << std::endl;
}
};
template <typename T>
void callF(){
T::f();
}
int main(){
callF<A>();
callF<B>();
return 0;
}
在這里,我對callF
使用所需類型的顯式專門化。
我意識到swift的泛型不是模板,我不能隨便調用任何我想調用的東西,如果無效的話,讓編譯器中斷,所以我添加了一個協議,並使泛型參數要求符合該協議(在下面的示例中為P
)但是我似乎無法找到一種方法告訴編譯器我要使用某種類型而不將其包括在函數簽名中。
這是我想到的最干凈的方法:
protocol P{
static func f();
}
class A : P {
static func f(){
print("A.f()")
}
}
class B : P {
static func f(){
print("B.f()")
}
}
func callF<T:P>() -> T? {
T.f()
return nil
}
let _:A? = callF()
let _:B? = callF()
我真的不喜歡在代碼中使用虛擬變量,但是我無法解決此問題。
關於如何避免在函數簽名中使用虛擬變量並迅速找出我要使用哪種類型的想法? 我顯然嘗試過callF<A>()
並得到: 錯誤:無法顯式專門化泛型函數
您應該將要調用f()
的類型作為輸入參數callF
給callF
函數。
func callF<T:P>(on type:T.Type) {
type.f()
}
callF(on: A.self) // A.f()
callF(on: B.self) // B.f()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.