Как проверить, является ли объект видом блока или нет - PullRequest
16 голосов
/ 12 июля 2011

Как мы можем идентифицировать какой-либо конкретный объект типа блока или нет?

например,

NSSet *set =[NSSet setWithObjects:
             @"name1",
             @"name2",
             [^{ /* ..... some code */ } copy],
             nil];

Как мы можем узнать, какой объект из множества является своего рода блоком?

Ответы [ 6 ]

11 голосов
/ 29 апреля 2013

Существует более безопасный способ определить, является ли что-то блоком, без фактического использования частного API или создания класса с использованием частного имени строки:

- (BOOL)isBlock:(id)item {
    id block = ^{};
    Class blockClass = [block class];
    while ([blockClass superclass] != [NSObject class]) {
        blockClass = [blockClass superclass];
    }
    return [item isKindOfClass:blockClass];
}
7 голосов
/ 12 июля 2011

Оберните свой блок в свой класс:

BlockWrapper *blockWrapper = [BlockWrapper wrapperWithBlock:^{ … }];

Проверьте тип и извлеките фактический блок:

if ([obj isKindOfClass:[BlockWrapper class]]) {
    codeBlock = [(BlockWrapper*)obj block];
}
4 голосов
/ 12 июля 2011

Нет поддерживаемых способов сделать это. Вы должны отслеживать, какие объекты являются блоками, и каковы их сигнатуры типов.

У вас есть практический вариант использования набора смешанных строк и блоков?

3 голосов
/ 12 июля 2011

Это возможно, но я бы не рекомендовал делать это, потому что NSBlock не является публичным классом, и его имя может измениться в будущем:

if ([obj isKindOfClass:NSClassFromString(@"NSBlock")]) {
    NSLog(@"It's a block!");
}
2 голосов
/ 12 июля 2011

Если у вас есть только строки и блоки, просто отметьте ![thing isKindOfClass:[NSString class]]. то есть инвертировать ваш тест.

Аналогично, если у вас есть строки, числа и блоки, проверьте, что thing не является строкой или числом, и в этом случае он должен (по вычету) быть блоком. Либо это, либо ваша программа неверна и вылетит.

0 голосов
/ 12 июля 2011

Полагаю, что ![thing isKindOfClass:[NSObject class]], хотя и технически некорректно (вам не нужно создавать подкласс NSObject), вероятно, получит то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...