2

マクロ定義でブロックを使用しようとしていますが、うまくいきません。

コードは次のとおりです。

#define IPHONE_OR_IPAD_BLOCK(void(^iphoneBlock)(void), void(^ipadBlock)(void)) ({ \
    if (iphoneBlock && (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)) \
    { \
        iphoneBlock(); \
    } \
    else if (ipadBlock) \
    { \
        ipadBlock(); \
    } \
})

コンパイルされていないようです。

マクロでブロックを使用することをどのように提案しますか?

更新: Ramy Al Zuhouri への迅速な返信に感謝します。より多くの型チェックを提供するため、代わりに静的関数に固執します。

NS_INLINE void DoIphoneOrIpadBlock(void (^iphoneBlock)(void), void (^ipadBlock)(void))
{
    if (iphoneBlock && (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone))
    {
        iphoneBlock();
    }
    else if (ipadBlock)
    {
        ipadBlock();
    }
}
4

1 に答える 1

2

マクロにはパラメータチェックがないので、次のように変更します。

#define IPHONE_OR_IPAD_BLOCK(iphoneBlock, ipadBlock) ({ \
    if (iphoneBlock && (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)) \
    { \
        iphoneBlock(); \
    } \
    else if (ipadBlock) \
    { \
        ipadBlock(); \
    } \
})

間違ったパラメータで使用すると、構文エラーが発生する可能性があります。
この動作が気に入らない場合は、インライン関数を使用して変更できます。

于 2012-12-13T12:25:23.830 に答える