gpt4 book ai didi

ios - 在swift中调用具有动态类名的方法

转载 作者:搜寻专家 更新时间:2023-10-30 22:22:14 25 4
gpt4 key购买 nike

我们如何使用动态类名调用类函数?

假设下面的例子中我有两个具有相同签名方法的类

class Foo{
class func doSomething()

}

class Foobar {
class func doSomething()
}

class ActualWork{
//call following method with a variable type so that it accepts dynamic class name
func callDynamicClassMethod(x: dynamicClass)
x.doSomething()
}

如何实现才能使 x 在运行时接受值

编辑:抱歉,我没有提到我正在寻找除面向协议(protocol)的方法之外的任何其他方法。这更像是一个探索性问题,需要探索是否有更直接的方法/pods/库来实现这一点。

最佳答案

我喜欢这个问题,因为它让我有点跳出框框思考。

我会把它分成几个部分来回答。

首先

call class functions

类函数基本上是一个Type methods ,这可以使用 class 上下文中的 static 词来实现。

考虑到这一点,您可以获得一个简单的解决方案,使用 protocol并像这样传递类引用(符合该协议(protocol)):

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());
}

第三

如果您需要像 OP 最初那样使用 class func 语法:

class func doSomething()

您不能简单地使用协议(protocol)。因为协议(protocol)不是一个类......所以编译器不会允许它。

Cannot declare class function inside protocol

但它仍然是可能的,你可以通过使用 SelectorNSObject.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");

}

关于ios - 在swift中调用具有动态类名的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54550910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com