2016-04-18 7 views
0

Innerhalb einer Klasse verwende ich eine Variable wie einen Prozentsatz, und ich möchte, dass es einige Grenzen hat. Zum Beispiel: Ich habe den Wert zwischen 0 und 100 liegen soll Wenn der Wert auf 105 gesetzt ist, dann wird der Wert gespeichert 100.Erstellen von Setter mit Grenzen in Swift

würde ich umgesetzt erste:

var percentage: Int{ 
    set{ 
     if (newValue < 0) { 
      self.percentage = 0 
     } else if (newValue > 100) { 
      self.percentage = 100 
     } else { 
      self.percentage = newValue 
     } 
    } 
} 

Leider bekomme ich einen Fehler EXC_BAD_ACCESS aufgrund einer Endlosschleife auf dem Setter. Suche nach einer Lösung, habe ich zwei verschiedene Ansätze gefunden:

Erster Ansatz mit zwei Variablen:

var percentageWithBoundaries: Int 

var percentageWithoutBoundaries: Int{ 
    get{ 
     return percentageWithBoundaries 
    } 
    set{ 
     if (newValue < 0) { 
      percentageWithBoundaries = 0 
     } else if (newValue > 100) {      
      percentageWithBoundaries = 100 
     } else { 
      percentageWithBoundaries = newValue 
     } 
    } 
} 

Zweiter Ansatz didSet:

var percentage: Int{ 
    didSet{ 
     if (percentage < 0) { 
      percentage = 0 
     } else if (percentage > 100) { 
      percentage = 100 
     } 
    } 
} 

ich die zweite glauben Ansatz ist besser: prägnanter und einfacher zu verstehen.

Ich würde gerne wissen, ob es eine bessere Praxis gibt oder ob eine dieser beiden bevorzugt werden sollte.

Danke!

+0

Die Verwendung von 'didSet' ist definitiv der richtige Ansatz für das, was Sie wollen. – werediver

+0

Danke, aber kannst du eine Erklärung geben, warum es für dich der beste Ansatz sein sollte? – Jojo44

+0

Nur weil es der einfachste und geradlinigste Weg ist. – werediver

Antwort

0
var percentage: Int{ 
    didSet{ 
     if (percentage < 0) { 
      percentage = 0 
     } else if (percentage > 100) { 
      percentage = 100 
     } 
    } 
} 

Dieser Ansatz ist am besten mit variablen Bedingungen einzustellen.

+0

Irgendeine Erklärung warum? – Jojo44

0

Ersetzen Sie Ihren Code wie folgt oder nach Ihren Bedürfnissen;

willSet wird aufgerufen, kurz bevor der Wert gespeichert wird.

didSet wird sofort aufgerufen, nachdem der neue Wert gespeichert wurde.

var percentage: Int = 0{ 
    didSet{ 
     if (percentage < 0) { 
      percentage = 0 
     } else if (percentage > 100) { 
      percentage = 100 
     } 
    } 
} 
+0

Ist die else-Anweisung notwendig, da der Wert bereits gespeichert wurde? – Jojo44

+0

@ Jojo44 Ich änderte den Code mit einem neuen. Nein, es gibt keine Notwendigkeit für eine andere Aussage. –

+2

Ok, dann sehe ich den Unterschied mit meinem zweiten Anflugcode nicht ...:/ – Jojo44

Verwandte Themen