以下の構文をいくつかのサンプルコードで見ましたが、理解できるかどうかわかりません。
CGRect imageRect = (CGRect){.size = baseImage.size};
CGRect
これは、次と同等の初期化の簡単な方法ですか?
CGRect imageRect = CGRectMake(0,0,baseImage.size.width, baseImage.size.height);
タイピングがわずかに少ないこと以外に、この構文に利点はありますか?
以下の構文をいくつかのサンプルコードで見ましたが、理解できるかどうかわかりません。
CGRect imageRect = (CGRect){.size = baseImage.size};
CGRect
これは、次と同等の初期化の簡単な方法ですか?
CGRect imageRect = CGRectMake(0,0,baseImage.size.width, baseImage.size.height);
タイピングがわずかに少ないこと以外に、この構文に利点はありますか?
それが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 は構造フィールド名をオートコンプリートしません。
これは単なる省略構文ではなく、サイズのみを変更し、元の値は変更しない場合、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)};
お役に立てれば
http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.htmlを初期化するC99/GCCスタイルのように見えます