Standardwert einer Objective-C-Struktur und Testverfahren

Lesezeit: 4 Minuten

Ich versuche zu testen, ob eine Eigenschaft bereits festgelegt wurde. Ich kenne das mit Objekten, die ich habe:

CGRect ppGoalFrame;
LocalPlaySetup *localPlaySetup;

und ich kann testen

if (localPlaySetup == nil)

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.

Benutzeravatar von Andrew
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

Benutzeravatar von gavinb
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

Benutzeravatar von Martin Bissegger
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.

Nikitas Benutzeravatar
Nikita

Eigentlich gibt es eine naheliegende und elegante Lösung (lol):

SomeStruct someStruct = {0};

Was nur alle “Elemente” der Struktur mit Nullen füllt.

Benutzeravatar der Community
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

1394370cookie-checkStandardwert einer Objective-C-Struktur und Testverfahren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy