显式特化泛型函数是 swift

Explicitly specialize a generic function is swift

我正在尝试使用通用函数在 swift class 上调用静态方法,所以我真的不需要 class 的类型是函数签名的一部分。
似乎无法找到一种方法来做到这一点。

这是我正在尝试执行的操作的 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()

我真的不喜欢在我的代码中使用假人,但我无法解决这个问题。
关于如何避免在函数签名中使用假人并让 swift 找出我想使用哪种类型的任何想法?我显然尝试了 callF<A>() 并得到:错误:无法显式特化通用函数

您应该将希望 f() 调用的类型作为输入参数传递给 callF 函数。

func callF<T:P>(on type:T.Type) {
    type.f()
}

callF(on: A.self) // A.f()
callF(on: B.self) // B.f()