Objective-C:如何检查类是否按类别扩展?

Man*_*nni 2 objective-c categories

在Java中,您可以使用instanceof检查类是否扩展另一个类或实现接口.

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

if ([myObject isKindOfClass:[AnClass class]]) { }
Run Code Online (Sandbox Code Playgroud)

但我怎么能检查,如果一个类被通过扩展类别


编辑2

不幸的是,我的第一个编辑的代码有点令人困惑和荒谬,抱歉!现在,这是我的新代码:

我将解释整个问题:
我有一个课程ViewCustomerCreate延伸UITableViewController.ViewCustomerCreate按类别扩展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];
}
Run Code Online (Sandbox Code Playgroud)

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

我认为我不能使用isKindOfClass来检查一个类是否被一个类扩展,不是吗?

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


编辑3

天哪,我把分类与协议混为一谈!! Aaaaahhhhh ^^

解决方案:

if ([parentViewContr conformsToProtocol:@protocol(ICheckBox)]) {
Run Code Online (Sandbox Code Playgroud)

Jas*_*ien 6

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

- (BOOL)respondsToSelector:(SEL)sel;
Run Code Online (Sandbox Code Playgroud)

在Objective-C中,您应该更少关注对象什么,并且更担心对象可以做什么.

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

你应该这样使用:

if ([myObject respondsToSelector:@selector(myMethod:)])
{
    // do whatever you need to do
}
Run Code Online (Sandbox Code Playgroud)

快速说明一下,因为您提到了Java接口.您可以使用以下命令检查对象是否实现了协议(类似于Java接口,但不完全相同):

- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
Run Code Online (Sandbox Code Playgroud)