несовместимые типы указателей блоков, инициализирующие void (^) (struct ALAssetsGroup *, BOOL *) 'выражением типа - PullRequest
3 голосов
/ 04 августа 2011

Я видел, что несколько человек на SO успешно использовали этот код.Но я получил несовместимую ошибку указателя блока:

Несовместимые типы указателей блока, инициализирующие

void(^)(struct ALAssetsGroup *, BOOL *)

выражением типа

void(^)(ALAsset *, NSUInteger, BOOL *)

Есть какие-нибудь подсказки?(РЕДАКТИРОВАТЬ с полным кодом)

    ALAssetsLibrary *library =[[ALAssetsLibrary alloc]init];
    void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop){
    if(result != NULL) {
                NSLog(@"See Asset: %@", result);

            }
        };

    void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
            if(group != nil) {NSLog(@"dont See Asset: ");
                [group enumerateAssetsUsingBlock:assetEnumerator];
            }
        };

    [library enumerateGroupsWithTypes:ALAssetsGroupAlbum
                               usingBlock:assetGroupEnumerator
                             failureBlock: ^(NSError *error) {
                                 NSLog(@"Failure");
                             }];

enter image description here

Ответы [ 2 ]

9 голосов
/ 05 августа 2011

ОК, новичок в блоках ... но я нашел еще один пример блока перечислителя группы активов, и в объявлении не было struct.Я попытался удалить его из кода выше, и он все еще работает нормально и не имеет сообщения об ошибке.Надеюсь, кто-то, кто понимает лучше struct, может объяснить?

попробуйте изменить эту строку:

void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) 
            = ^(ALAssetsGroup *group, BOOL *stop)

на эту:

void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) 
            = ^(ALAssetsGroup *group, BOOL *stop)

Я думаю, что нижняя строкаALAssetsLibrary enumerateGroupsWithTypes: usingBlock: ожидает, что блок будет выглядеть как (ALAssetsGroup *, BOOL *), а не (struct ALAssetsGroup *, BOOL *).

3 голосов
/ 05 августа 2011

Разница между ожидаемым и фактическим типом - это просто работа struct , т.е. struct ALAsset* против ALAsset*. (В вашем текстовом описании это выглядит как несоответствие между ALAsset и ALAssetGroups, но я думаю, что вы сделали ошибку при копировании сообщения об ошибке.)

Я не совсем понимаю, откуда эти различия (возможно, из-за использования C ++ где-нибудь?).

В любом случае, лучшим решением будет использование определения типа ALAssetsGroupEnumerationResultsBlock или ALAssetsLibraryGroupsEnumerationResultsBlock соответственно, например ::

ALAssetsGroupEnumerationResultsBlock assetEnumerator = ^(ALAsset *result, NSUInteger index, BOOL *stop){
    if (result != NULL) {
            NSLog(@"See Asset: %@", result);
        }
    };
...