gpt4 book ai didi

ios - 在 Objective-C 中,当我不确定对象的类时如何调用对象的协议(protocol)选择器?

转载 作者:行者123 更新时间:2023-11-28 18:36:56 25 4
gpt4 key购买 nike

我有 C++ 背景,我对如何将特定概念转换为 Objective-C 感到有点困惑。

C++允许多重继承,所以你会看到很多这样的设计:

class Z {
virtual void doSomething() {...}
};
class A : V, W, Z {
void doSomething() {...}
};
class B : X, Y, Z {
void doSomething() {...}
};
void callDoSomething(Z* inheritsFromZ) {
inheritsFromZ->doSomething();
}
A *a = new A();
callDoSomething(a);

关于此的关键是您可以不知道指针 inheritsFromZ 处的对象具有什么特定类型——您所关心的只是该对象实际实现了类 Z 定义的接口(interface)。

Objective-C 不允许多重继承,但它确实允许一个类使用多个协议(protocol)。我的问题是我不知道如何将变量或选择器参数声明为“使用协议(protocol) Z 的东西”,就像 C++ 让您使用 Z* 的方式一样。

例如,这里有一些快速的 Objective-C 伪代码:

@protocol A
- (void)selectorB;
@end

@interface C : NSObject <A>
@end
@implementation C
- (void)misc {
E* e = [[E alloc] initWithCallableA:self];
}
- (void)selectorB {
NSLog(@"In C");
}
@end

@interface D : NSObject <A>
@end
@implementation D
- (void)misc {
E* e = [[E alloc] initWithCallableA:self];
}
- (void)selectorB {
NSLog(@"In D");
}
@end

@interface E : NSObject
@end
@implementation E
- (id)initWithCallableA:(id)implementsA {
self = [super init];
if (self) {
[implementsA selectorB]; // compiler doesn't like this
}
return self;
}
@end

SO 上有很多关于如何调用由特定类实现的选择器的问题,当您只有一个更通用的指向该类对象的指针时;例如,您可以访问您的 presentingViewController 并且您知道它的类类型是 M*,但是 Xcode 提示它只是一个 UIViewController*...在这种情况下您可以直接转换变量。 (不漂亮,但它有效。)

这里的区别在于,当一个指针可以引用多个类类型时,您所知道的是,无论它是哪个类都实现了特定的协议(protocol)。

最佳答案

    [implementsA selectorB]; // compiler doesn't like this

这不是,因为编译器没有像您在回答中所想的那样对协议(protocol)进行类型化。请参阅查克的评论。

可能您只是忘记了导入协议(protocol)。

无论如何,将协议(protocol)添加到类型中是更好的方法。

关于ios - 在 Objective-C 中,当我不确定对象的类时如何调用对象的协议(protocol)选择器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16993038/

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