webentwicklung-frage-antwort-db.com.de

CGRect-Syntax habe ich noch nicht gesehen

Ich habe die Syntax unten in einem Beispielcode gesehen und bin mir nicht sicher, ob ich sie verstehe.

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

Ist dies einfach eine Kurzform zum Initialisieren einer CGRect-Entsprechung:

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

Hat diese Syntax einen Vorteil neben etwas weniger Tippen?

26
No Grabbing

Das ist C99 Initialisierungssyntax . Sie können es mit jeder Struktur verwenden.

Der Hauptvorteil eines Objective-C besteht darin, dass Sie eine sehr Objective-C-artige Syntax erhalten, bei der die Felder den Werten nahekommen und nicht durch die Positionierung impliziert werden. (Das heißt nicht, dass dies absichtlich ähnlich ist oder dass es der einzige Vorteil ist. Aber es ist Nizza.)

Es ist manchmal etwas more tippen, aber ich verwende es jetzt überall.

Erwägen:

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

Um dies zu verstehen, müssen Sie die Reihenfolge der Parameter verstehen. Sie müssen auch in der Lage sein, die Kommas mit Ihren Augen leicht zu fangen. In diesem Fall ist das ziemlich einfach, aber wenn die Ausdrücke komplizierter wären, würden Sie sie wahrscheinlich zuerst in einer temporären Variablen speichern.

Der C99-Weg:

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

Es ist länger, aber expliziter. Es ist auch sehr leicht zu verfolgen, was dem zugeordnet wird, egal wie lang der Ausdruck ist. Es ist auch eher eine Objective-C-Methode. Wenn CGRect eine Klasse wäre, würde es wahrscheinlich so aussehen:

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

Sie können auch folgende Dinge tun:

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

Hier erstellen Sie ein Rechteck mit CGPoint und CGSize. Der Compiler versteht, dass .Origin eine CGPoint und .size eine CGSize erwartet. Sie haben das zur Verfügung gestellt. Alles ist Soße.

Der äquivalente Code wäre CGRectMake(myOrigin.x, myOrigin.y, size.width, size.height). Mit CGRectMake drücken Sie dem Compiler nicht mehr dieselbe Bedeutung zu. Es kann Sie nicht davon abhalten, dem Origin einen Teil der Größe zuzuweisen. Es wird Sie auch nicht daran hindern, die Breite der Höhe zuzuordnen. Es gibt nicht einmal einen guten Hinweis darauf, welches das X und Y ist; Wenn Sie APIs verwendet haben, die zuerst vertikale Koordinaten bereitstellen, wird dies falsch sein.

Sie können auch Teile aus einer Struktur und Teile aus Floats zuweisen:

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

Die Funktion CGRectMake ist älter als C99. Ich habe keine Beweise dafür, aber ich glaube, wenn C99 zuerst gekommen wäre, würde CGRectMake wahrscheinlich gar nicht existieren; Es ist die Art von knuspriger Funktion, die Sie schreiben, wenn Ihre Sprache keine direkte Möglichkeit hat, die Initialisierung durchzuführen. Aber jetzt ist es soweit.

Wenn Sie es für eine Weile verwenden, bevorzugen Sie wahrscheinlich die C99-Syntax. Es ist expliziter, flexibler, objektiver-C-ähnlicher und schwerer zu vermasseln.

Leider wird Xcode ab 4.6 die Feldnamen der Struktur nicht automatisch vervollständigen, wenn Sie sich in der C99-Feldinitialisierungsliste befinden.

41
Steven Fisher

Dies ist nicht nur eine Abkürzungssyntax, sondern auch nützlich, wenn Sie nur die Größe und nicht den Ursprung in CGRect ändern möchten und umgekehrt.

Beispiel: Ich möchte nur die Größe ändern und die Position hat eine komplizierte Syntax und ich möchte sie nicht ändern. Noramlly würde ich tun

CGRect imageRect = CGRectMake(Sprite.Origin.x,Sprite.Origin.y,40, 60);

Mit der anderen Syntax würde ich das tun

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

wir können auch direkt Methoden hinzufügen, subtrahieren und multiplizieren zB.

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

Hoffe das hilft

4
Bharat Gulati

es sieht aus wie C99/GCC-Stil beim Initialisieren http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

0
blub