Wie überprüfe ich, ob ein CGPoint initialisiert wurde?
Möchte ich zunächst einen CGPoint Eigenschaft zu einem bestimmten Punkt (in der Mitte des Bildschirms). Andere Methoden können nachträglich ändern wollen, diese Eigenschaft. Meine Gedanken waren zu initialisieren, wenn es leer in der getter, aber ich bekomme die Meldung Ungültiger argument-Typ "struct CGPoint' unärer-Ausdruck. Ich habe auch versucht mit if Eigenschaft == nil oder 0, aber keine Freude.
Irgendwelche Gedanken?
-(CGPoint)graphOrigin
{
//initialise to centre of screen if has not been set
if(!_graphOrigin) //this expression is causing the problem
{
CGPoint origin = CGPointMake(self.bounds.origin.x + self.bounds.size.width / 2, self.bounds.origin.y + self.bounds.size.height / 2);
_graphOrigin = origin;
}
return _graphOrigin;
}
InformationsquelleAutor der Frage Alan | 2012-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
CGPoint
ist eine Struktur, so können Sie nicht setzen es auf null oder NULL (es ist nicht ein pointer). In einem gewissen Sinn, es gibt wirklich keine "nicht initialisierte" Zustand. Vielleicht könnten Sie verwenden{0.0, 0.0}
zu benennen, die ein unsetCGPoint
aber das ist auch eine gültige Koordinate. Oder Sie können negativex
undy
Werte Kennzeichnen eine "nicht initialisierte" Punkt, da negative Werte können nicht gültig sein, Punkte zeichnen, aber das ist ein bisschen ein hack, auch.Wahrscheinlich Ihre beste Wette ist, um eines von zwei Dingen tun:
CGPoint
. Dieser Wert kann eingestellt werden, umNULL
wenn auf nicht initialisierte. Natürlich, Sie haben Grund zur Sorgemalloc
ing undfree
des Wertes.Speichern der
CGPoint
neben einerBOOL
genanntpointInitialized
oder somesuch, zunächstNO
aberYES
einmal zu der Stelle initialisiert worden ist. Sie können sogar wickeln, dass in einem struct:InformationsquelleAutor der Antwort mipadi
Ein einfacher Weg wäre, zu initialisieren _graphOrigin zu CGRectZero und ändern Sie Ihre wenn-Anweisung für diese:
InformationsquelleAutor der Antwort François Marceau
CGPoint keine nicht initialisierten Status. Allerdings, wenn Sie denken, der Punkt (0, 0) nicht initialisiert, Sie könnte verwenden
Dies funktioniert, weil, wenn ein Objective-C-Instanz initialisiert wird, werden alle seine ivar gerodet, um bits von null, die in der CGFloat Darstellung ist 0,0.
(Hinweis: Die
==
ist in Ordnung hier, auch wenn die Operanden sind CGFloat weil wir wollen, zu vergleichen mit der eine exakte bit-Muster (ignoriert die Frage von -0))InformationsquelleAutor der Antwort kennytm
Seit CGPointZero (0,0) und jedem anderen Wert, den Sie geben einen Punkt, kann es in Ihrem Kontext
können Sie initialisieren möchten eine NSValue mit Ihrem Punkt über:
Könnten Sie dies auf der Grundlage einer Bedingung und dann später testen die NSValue nil.
NSValue können ebenfalls Hinzugefügt werden, um ein array zurück, das Ihnen erlauben würde, eine Reihe von Punkten sollten Sie.
Auf den Punkt zu später einfach verwenden:
InformationsquelleAutor der Antwort Zigglzworth
Erstellen Sie zwei CGPoint Eigenschaften, so sind Sie beide "nicht initialisierte". Legen Sie eine von Ihnen und verwenden Sie die zweite zu überprüfen, ob oder nicht Sie sind gleich.
Idk, wenn man bedenkt, würde auf diese Weise hackish obwohl. Und ich weiß, deine Frage wurde schon beantwortet, aber ich hatte irgendwie das gleiche dilemma, bis ich dachte, dieser.
InformationsquelleAutor der Antwort Tony
InformationsquelleAutor der Antwort Sergey Demchenko