26

以下の構文をいくつかのサンプルコードで見ましたが、理解できるかどうかわかりません。

 CGRect imageRect = (CGRect){.size = baseImage.size};

CGRectこれは、次と同等の初期化の簡単な方法ですか?

 CGRect imageRect = CGRectMake(0,0,baseImage.size.width, baseImage.size.height);

タイピングがわずかに少ないこと以外に、この構文に利点はありますか?

4

3 に答える 3

43

それがC99 の初期化構文です。どんな構造でも使えます。

Objective-C の主な利点は、Objective-C に非常に似た構文が得られることです。この構文では、フィールドが配置によって暗示されるのではなく、値に近いものになります。(これが意図的に似ていると言っているわけではありません。また、それが唯一の利点であると言っているわけでもありません。しかし、それは素晴らしいことです。)

タイピングが少し増えることもありますが、今ではどこでも使用しています。

検討:

CGRect a = CGRectMake(a+c/2, b+d/2, c, d);

これを理解するには、パラメーターの順序を理解する必要があります。また、コンマを目で簡単にキャッチできる必要があります。この場合、それは非常に簡単ですが、式がより複雑な場合は、最初にそれらを一時変数に格納することになるでしょう。

C99 の方法:

CGRect a = (CGRect){
    .origin.x = a+c/2,
    .origin.y = b+d/2,
    .size.width = c,
    .size.height = d
};

長くなりますが、より明確です。また、式がどれだけ長くても、何が何に割り当てられているかを追跡するのは非常に簡単です。また、Objective-C メソッドに似ています。結局のところ、CGRect がクラスである場合、おそらく次のようになります。

CGRect *a = [[CGRect alloc] initWithOriginX:x originY:y width:w height:h];

次のようなこともできます。

CGRect a = (CGRect){
    .origin = myOrigin,
    .size = computedSize
};

ここでは、CGPointとを使用して長方形を作成していCGSizeます。.originコンパイラは、 が を期待しCGPoint、 を.size期待していることを理解していCGSizeます。あなたはそれを提供しました。すべての肉汁。

同等のコードはCGRectMake(myOrigin.x, myOrigin.y, size.width, size.height). を使用CGRectMakeすることで、コンパイラに対して同じ種類の意味を表現しなくなります。サイズの一部を原点に割り当てることを止めることはできません。また、幅を高さに割り当てることもできます。どちらが X で Y であるかについての良い手がかりさえ与えてくれません。最初に垂直座標を提供する API を使用したことがある場合は、間違っていることになります。

構造体の一部とフロートの一部を割り当てることもできます。

CGRect a = (CGRect){
    .origin = myOrigin,
    .size.width = c,
    .size.height = d
};

このCGRectMake関数は C99 よりも前のものです。CGRectMakeこの趣旨の証拠はありませんが、C99 が最初に登場した場合、おそらくまったく存在しなかったと思います。これは、言語に初期化を実行する直接的な方法がない場合に作成する、一種の無愛想な関数です。しかし、今はそうです。

基本的には、しばらく使っていると、おそらく C99 構文を好むようになるでしょう。より明示的で、より柔軟で、Objective-C に似ており、台無しにするのがより困難です。

残念ながら、4.6 の時点で、C99 フィールド初期化子リストにある場合、Xcode は構造フィールド名をオートコンプリートしません。

于 2013-02-06T07:55:06.947 に答える
4

これは単なる省略構文ではなく、サイズのみを変更し、元の値は変更しない場合、CGRectまたはその逆の場合にも役立ちます。

例:サイズのみを変更したいのですが、位置の構文が複雑で、変更したくありません。Noramlly、私はします

CGRect imageRect = CGRectMake(sprite.origin.x,sprite.origin.y,40, 60);

他の構文で私はします

CGRect imageRect = (CGRect){.size = sprite.size};

また、加算、減算、乗算のメソッドを直接使用することもできます。

 CGRect imageRect = (CGRect){.size = ccpAdd(sprite.size,addsize)};

お役に立てれば

于 2013-02-06T07:44:03.457 に答える
0

http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.htmlを初期化するC99/GCCスタイルのように見えます

于 2013-02-06T07:44:15.063 に答える