Objective- C Blocks: несовместимые типы указателей блоков - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь реализовать вызов блока. Вот мой метод:

- (void) runTest; {
    void (^MyBlock)(id, NSUInteger, BOOL) = ^(id obj, NSUInteger idx, BOOL stop) {
        NSLog(@"Video game %@", (NSString *)obj);
    };

    BOOL stop;
    MyBlock(@"Path of exile", 0, &stop);

    NSArray *videoGames = @[@"fallout", @"Deus ex",@"final fintasy"];

    [videoGames enumerateObjectsUsingBlock:MyBlock];
}

Но в этой строке:

[videoGames enumerateObjectsUsingBlock:MyBlock];

Я получаю эту ошибку:

Incompatible block pointer types sending 'void (^__strong)(__strong id, NSUInteger, BOOL)' to parameter of type 'void (^ _Nonnull)(id _Nonnull __strong, NSUInteger, BOOL * _Nonnull)'

Кто-нибудь из вас знает, что я делаю не так или как я могу это исправить?

Я очень признателен за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

параметр Bool блока должен быть указателем, поэтому вам нужно добавить *

- (void) runTest; {
    void (^MyBlock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"Video game %@", (NSString *)obj);
    };

    BOOL stop;
    MyBlock(@"Path of exile", 0, &stop);

    NSArray *videoGames = @[@"fallout", @"Deus ex",@"final fintasy"];
   [videoGames enumerateObjectsUsingBlock:MyBlock];
}
1 голос
/ 29 мая 2020

Третий параметр MyBlock должен быть указателем BOOL.

Итак, добавьте * как показано ниже

     void (^MyBlock)(id, NSUInteger, BOOL*) = ^(id obj, NSUInteger idx, BOOL *stop) {
         NSLog(@"Video game %@", (NSString *)obj);
     };

https://developer.apple.com/documentation/foundation/nsarray/1415846-enumerateobjectsusingblock?language=objc

  • (void) enumerateObjectsUsingBlock: (void (^) (ObjectType obj, NSUInteger idx, BOOL * stop)) block;
...