Мне понравился этот вопрос, потому что он заставил меня задуматься над мелочью вне коробки.
Я отвечу на него, разделив его на несколько частей.
Первый
Функции класса вызова
Функция класса в основном представляет собой Методы типа , которые могут быть достигнуты с помощью static
слово внутри контекста class
.
Принимая это во внимание, вы можете получить простое решение, используя протокол и передавая ссылку на класс (соответствующую этому протоколу) следующим образом:
protocol Aaa{
static func doSomething();
}
class Foo : Aaa{
static func doSomething() {
print("Foo doing something");
}
}
class FooBar : Aaa{
static func doSomething() {
print("FooBar doing something");
}
}
class ActualWork{
//Using class (static) method
func callDynamicClassMethod <T: Aaa> (x: T.Type) {
x.doSomething();
}
}
//This is how you can use it
func usage(){
let aw = ActualWork();
aw.callDynamicClassMethod(x: Foo.self);
aw.callDynamicClassMethod(x: Foo.self);
}
Секунда
Если вам не нужен метод в контексте класса, вы можете рассмотреть возможность использования методов экземпляра.В этом случае решение было бы еще проще, например:
protocol Bbb{
func doSomething();
}
class Bar : Bbb{
func doSomething() {
print("Bar instance doing something");
}
}
class BarBar : Bbb{
func doSomething() {
print("BarBar instance doing something");
}
}
class ActualWork{
//Using instance (non-static) method
func callDynamicInstanceMethod <T: Bbb> (x: T){
x.doSomething();
}
}
//This is how you can use it
func usage(){
let aw = ActualWork();
aw.callDynamicInstanceMethod(x: Bar());
aw.callDynamicInstanceMethod(x: BarBar());
}
Третий
Если вам нужно использовать синтаксис class func
, как первоначально делал OP:
class func doSomething ()
Вы НЕ МОЖЕТЕ просто использовать протокол.Поскольку протокол не является классом ... Таким образом, компилятор не допустит его.
Но все же возможно, вы можете добиться этого с помощью Селектор с NSObject.perform Метод
как это:
class ActualWork : NSObject{
func callDynamicClassMethod<T: NSObject>(x: T.Type, methodName: String){
x.perform(Selector(methodName));
}
}
class Ccc : NSObject{
@objc class func doSomething(){
print("Ccc class Doing something ");
}
}
class Ddd : NSObject{
@objc class func doSomething(){
print("Ccc class Doing something ");
}
@objc class func doOther(){
print("Ccc class Doing something ");
}
}
//This is how you can use it
func usage() {
let aw = ActualWork();
aw.callDynamicClassMethod(x: Ccc.self, methodName: "doSomething");
aw.callDynamicClassMethod(x: Ddd.self, methodName: "doSomething");
aw.callDynamicClassMethod(x: Ddd.self, methodName: "doOther");
}