Frage

Ich habe eine Setter-Methode (setMinimumNumberOfSides), die ich nach der Verwendung von synthetisieren außer Kraft setzen möchten. Darin bin ich auf die Instanzvariable in einem Constraint setzen, um sicherzustellen, dass der int innerhalb bestimmter Grenzen liegt.

Später in einem benutzerdefinierten init-Methode, bin ich Einstellung eine andere Instanz Variable (NumberOfSides), aber ich muss sicher minimumNumberOfSides und maximumNumberOfSides machen wurde ordnungsgemäß in Grenzen gesetzt. Ich habe versucht, den Rückgabewert auf der Setter auf eine BOOL ändern, so konnte ich ein JA oder NEIN, wenn es gelungen, / nicht bestanden Pass zurück, aber das eine widersprüchliche Methode erstellt, vermute ich, weil ich verwende synthetisieren und das Überschreiben der Setter.

Wie kann ich die Informationen aus leicht zu überprüfen, um zu sehen, wenn die Setter genannt wurde und kehrte erfolgreich?

-(void)setNumberOfSides:(int)sides
{
    if ((sides < maximumNumberOfSides) && (sides > minimumNumberOfSides))
    {
        numberOfSides = sides;  
    }
    else
        NSLog (@"Invalid number of sides: %d is outside the constraints allowed", sides);


}

-(void)setMinimumNumberOfSides:(int)minimum 
{
    if (minimum > 2)
        minimumNumberOfSides = minimum;

}

-(void)setMaximumNumberOfSides:(int)maximum 
{
    if (maximum <= 12)
        maximumNumberOfSides = maximum;

}

-(id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max 
{
    if (self = [super init])
    {
        self.minimumNumberOfSides = min;
        self.maximumNumberOfSides = max;

        self.numberOfSides = sides;
    }
    return self;
}
War es hilfreich?

Lösung

Sie müssen nicht NumberOfSides synthetisieren, wenn Sie bei der Umsetzung des Getter und Setter planen. Ohne @synthesize numberOfSides können Sie eine BOOL zurück, wenn Sie wählen. Sie müssen die Getter / Setter in Ihrer Schnittstelle entsprechend erklären.

BTW, würde ein anderer Ansatz, den synthetisierten Getter / Setter zu verwenden und eine separate Methode -(BOOL)isNumberOfSidesValid hinzufügen, die diese Prüfung durchführt.

Andere Tipps

In einer Situation wie diese, können Sie mit einem einfachen Anruf besser dran assert() oder eine Ausnahme zu werfen.

Die Wahl wird davon abhängen, wie Sie diese Klasse sehen verwendet wird. Wenn es Teil einer Bibliothek sein wird, und Sie erwarten, dass andere Entwickler häufig falsche Werte für minimumNumberOfSides oder maximumNumberOfSides liefern, sollten Sie wahrscheinlich eine richtige Ausnahme aus.

Ein Wort der Warnung, though. Wenn Sie erwarten, dass die Benutzer Ihrer Anwendung zu häufig falsche Werte zu liefern, dann ist eine Ausnahme eine schlechte Idee. Ausnahmebehandlung in Objective-C ist eine teuere Operation. Wenn diese Überprüfungen an Ort und Stelle im Interesse des Benutzers sind, sollen Sie Eingabevalidierung durchführen und Fehler in eine viel freundlichen Weise an den Benutzer melden.

bearbeiten: Hier sind einige schnelle Beispielcode:

-(void)setMinimumNumberOfSides:(int)minimum
{
    if (minimum <= 2)
    {
        [NSException raise:@"invalid minimumNumberOfSides value"
                    format:@"value of %d is too low (must be > 2)", minimum];
    }

    minimumNumberOfSides = minimum;
}

bearbeiten: Hier eine andere Frage SO das geht ins Detail über die Ausnahmebehandlung in Objective-C.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top