aber wenn ich versuche, den CGRect mit == nil oder == NULL zu testen
if (ppGoalFrame == nil)
Ich bekomme
invalid operands to binary == (have 'CGRect' and 'void *')
So ist die CGRect “leer”, null, null …? bevor es eingestellt ist? Offensichtlich kann ich CGrect nicht mit einem void-Zeiger vergleichen (ich kann nicht verwenden ppGoalFrame == void); gibt es eine andere möglichkeit das zu testen? Das Objective-C ist bisher ziemlich einfach zu verstehen, aber sobald das C auftaucht, verliere ich ein wenig den Überblick.
Andreas
Nur Zeiger können null sein. CGRect ist eine Struktur – sie repräsentiert einen zusammenhängenden Speicherblock. Die einzige Möglichkeit festzustellen, ob es eingestellt wurde, besteht darin, seinen Inhalt zu überprüfen.
Apple bietet eine Konstante CGRectNull. Sie könnten Ihre Variable darauf setzen und die CGRectIsNull-Funktion verwenden, um festzustellen, ob sie gesetzt wurde. CGRectNull ist nicht dasselbe wie CGRectZero Sie brauchen sich also keine Sorgen zu machen, wenn der gewünschte Wert Null ist.
Beachten Sie, dass CGRectNull einfach eine CGRect-Struktur enthält, die mit Werten gefüllt ist, die Apple später für die CGRectIsNull-Funktion identifizieren kann. Es ist nicht dieselbe Null wie beim Vergleichen von Zeigern.
Am Ende habe ich CGRectIsEmpty zum Testen verwendet. Sie müssen sie in keiner Weise einstellen. Deine Antwort hat mich aber auf den richtigen Weg gebracht, also danke.
– Geben Sie einen Fehler ein
10. März 2010 um 7:47 Uhr
gab
Alle Instanzvariablen in einer Objective-C-Klasse werden auf Null initialisiert. Also alle Hinweise sind nil, Zahlen sind 0 und Strukturen werden auf Null gesetzt. Da CGRect eine einfache Struktur ist, wird sie initialisiert origin.x=0, origin.y=0, size.width=0, size.height=0.
Also um zu testen, ob Ihr CGRect gesetzt wurde, müssen Sie ihn (nach Wert) mit Null vergleichen. Das CGRectIsEmpty Funktion wird genau das tun:
if (CGRectIsEmpty(ppGoalFrame))
{
// ...
}
+1 tolle Antwort. Sie können es bearbeiten, um es zu verwenden CGRectIsEmpty Meiner Meinung nach.
– Dan Rosenstark
31. Juli 2012 um 21:07 Uhr
Danke @gavinb, das ist großartig. Ich persönlich würde den Verweis löschen CGRectEqualToRectda es jetzt “Legacy-Code” ist.
– Dan Rosenstark
1. August 2012 um 17:31 Uhr
Martin Bisegger
Aus CGGeometry.h:
/* Return true if `rect' is empty (that is, if it has zero width or height),
false otherwise. A null rect is defined to be empty. */
Ein leeres Rechteck ist eines ohne Fläche, bei dem eine oder beide Seiten Null sind.
Verwenden Sie stattdessen:
CGRect newRect = CGRectNull;
Es gibt keinen universellen „Nichts“-Wert. Es gibt nil für Objekte u NULL für Zeiger, aber es gibt kein Äquivalent für reine Werttypen – das haben sie immer etwas Wert, auch wenn es nur Unsinn ist. Sie können einen beliebigen Wert nehmen und sagen “Ich nenne das den Nullwert für diesen Typ” (sagen wir, #define IntNull 4444444 und hoffen, dass eine Berechnung diesen Wert nie versehentlich zurückgibt), aber es gibt keinen echten Nullwert.
Insbesondere im Fall von CGRect hat Apple die Taktik „wähle einen beliebigen Wert“ verwendet und definiert CGRectNull, aber CGRect-Variablen sind standardmäßig nicht darauf eingestellt – Sie müssen es speziell selbst einstellen. Standardmäßig sind CGRect-Instanzvariablen auf eingestellt CGRectZero, aber denken Sie daran, dass dies nur eine normale CGRect-Struktur an Position (0,0) mit 0 Breite und 0 Höhe ist. Und lokale CGRects in einer Funktion haben einen völlig unvorhersehbaren Wert.
Sie können CGRect auch in NSValue einschließen:
[NSValue valueWithCGRect:CGRectMake(x, y, width, height)]
Und dann vermeiden Sie die nil Wert.
Nikita
Eigentlich gibt es eine naheliegende und elegante Lösung (lol):
SomeStruct someStruct = {0};
Was nur alle “Elemente” der Struktur mit Nullen füllt.
Gemeinschaft
Ich glaube nicht, dass Sie einen binären Vergleich einer C-Struktur durchführen können, was ist was CGRect ist. Eine schnelle Google-Suche und Überprüfung der C For Dummies Desk Reference ergab nichts. Sie könnten CGRect ppGoalFrame deklarieren, die Mitglieder der Struktur mit Standardwerten initialisieren (falls noch nicht geschehen) und die Strukturmitglieder testen.
Update Edit: Diese Frage wurde für C-Strukturen gestellt.
Anders sieht es bei Objective-C aus, wenn es um Instanzvariablen geht.
– gab
10. März 2010 um 6:15 Uhr
@gavinb: Vielleicht. Ich frischen noch mein C auf, bevor ich mich in Objective-C stürze.
– CD Reimer
10. März 2010 um 6:19 Uhr
13943700cookie-checkStandardwert einer Objective-C-Struktur und Testverfahrenyes