gpt4 book ai didi

Objective-C:如何检查一个类是否被一个类别扩展?

转载 作者:行者123 更新时间:2023-12-02 21:50:28 26 4
gpt4 key购买 nike

在 Java 中,您可以使用 instanceof 来检查一个类是否扩展了另一个类或实现了一个接口(interface)。

在 Objective-C 中,您可以使用 isKindOfClass 来检查一个类是否扩展了另一个类:

if ([myObject isKindOfClass:[AnClass class]]) { }

但是我如何检查一个类是否被类别扩展了?


编辑2

不幸的是,我的第一次编辑代码有点困惑和无意义,抱歉!现在,这是我的新代码:

我将解释整个问题:
我有一个类ViewCustomerCreate,它扩展了UITableViewControllerViewCustomerCreate 通过类别 ICheckBox 进行扩展。这是我的代码,不起作用:

- (void)closeModalView {
UINavigationController *parent = (UINavigationController *)self.navigationController.parentViewController;
UIViewController *parentViewContr = parent.topViewController;

if ([parentViewContr isKindOfClass:[id<ICheckBox> class]]) { // ERROR-MESSAGE see below
id<ICheckBox> parent2 = (id<ICheckBox>)parentViewContr; // works fine :-)
[parent2 setSelectedElementId:checkedIndex]; // works fine :-)
}

[self.navigationController dismissModalViewControllerAnimated:YES];
}

错误消息是:错误:'id'不是 Objective-C 类名或别名

我认为我不能使用 isKindOfClass 来检查类是否由类别扩展,不是吗?

PS:我想要什么?我有一个带有复选框的通用模态视图,如果我关闭此 View ,父 View 应该知道用户选择的内容。


编辑3

天哪,我混淆了类别和协议(protocol)!!啊啊啊啊^^

解决方案:

if ([parentViewContr conformsToProtocol:@protocol(ICheckBox)]) {

最佳答案

无法检查类是否由类别扩展,但您可以使用以下方法检查实例是否响应特定选择器:

- (BOOL)respondsToSelector:(SEL)sel;

在 Objective-C 中,您应该少担心对象是什么,而更多地担心对象可以做什么

如果它走起来像鸭子,听起来像鸭子,看起来也像鸭子,那么它可能会飞,你知道我的意思吗?

您应该这样使用它:

if ([myObject respondsToSelector:@selector(myMethod:)])
{
// do whatever you need to do
}

由于您提到了 Java 接口(interface),所以请简单说明一下。您可以使用以下方法检查对象是否实现协议(protocol)(类似于 Java 接口(interface),但不完全相同):

- (BOOL)conformsToProtocol:(Protocol *)aProtocol;

关于Objective-C:如何检查一个类是否被一个类别扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955744/

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