3

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");
                             }];

ここに画像の説明を入力

4

2 に答える 2

9

structわかりました、ブロックの初心者です...しかし、ここでアセットグループ列挙子ブロックの別の例を見つけましたが、宣言にはありませんでした。上記のコードから削除しようとしましたが、それでも問題なく動作し、エラー メッセージは表示されません。うまくいけば、よりよく理解している誰かstructが説明できますか?

この行を変更してみてください:

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

これに:

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

要するに、 はnotALAssetsLibrary enumerateGroupsWithTypes: usingBlock:のように見えるブロックを期待しているということだと思います。(ALAssetsGroup *, BOOL *)(struct ALAssetsGroup *, BOOL *)

于 2011-08-05T13:14:54.663 に答える
3

期待される型と実際の型の違いは、単に work struct、つまりstruct ALAsset*vs.ALAsset*です。ALAsset(テキストの説明では、との間の不一致のように見えALAssetGroupsますが、エラーメッセージのコピーを間違えたと思います。)

これらの違いがどこから来るのかよくわかりません (おそらくどこかで C++ を使用しているためでしょうか?)。

とにかく、最善の解決策は、型定義ALAssetsGroupEnumerationResultsBlockまたはALAssetsLibraryGroupsEnumerationResultsBlockそれぞれを使用することです。

ALAssetsGroupEnumerationResultsBlock assetEnumerator = ^(ALAsset *result, NSUInteger index, BOOL *stop){
    if (result != NULL) {
            NSLog(@"See Asset: %@", result);
        }
    };
于 2011-08-05T13:20:31.527 に答える