2016-10-09 4 views
0

Während ich die Swift-Dokumentation durchführe, habe ich gelernt, dass es zwei Möglichkeiten gibt, Variablen in einer Klasse zu "initialisieren".Initializer versus Default Eigenschaftenwerte

  1. Durch einfaches deklarieren Standardeigenschaftswerte:
class Vehicle { 
    var numberOfWheels = 4 
    var currentSpeed = 0.0 
    var description: String { 
     return "traveling at \(currentSpeed) per hour" 
    } 
    func makeNoise() { 
     print("vroom vroom") 
    } 
} 

class Bicycle: Vehicle { 
    var hasBasket = true 
} 
  1. Durch die init-Methode
class Vehicle { 
    var numberOfWheels: Int 
    var currentSpeed: Double 
    init(numberOfWheels: Int, currentSpeed: Double) { 
     self.numberOfWheels = numberOfWheels 
     self.currentSpeed = currentSpeed 
    } 
    var description: String { 
     return "traveling at \(currentSpeed) per hour" 
    } 
    func makeNoise() { 
     print("vroom vroom") 
    } 
} 

class Bicycle: Vehicle { 
    var hasBasket: Bool 
    init() { 
     hasBasket = true 
     super.init(numberOfWheels: 2, currentSpeed: 10) 
    } 
} 

Natürlich sind diese beiden Code Samples haben unterschiedliche Ergebnisse, aber im Allgemeinen scheint die erste Methode etwas sauberer zu sein (weniger Code).

Warum sollte ich das eine über das andere verwenden und sehen Sie irgendwelche Probleme oder Dinge, die in beiden Lösungen vereinfacht werden könnten?

Antwort

1

Ihre zweite Methode (init) ermöglicht es Ihnen, Variablen zu übergeben, die die Klasse flexibler macht. Wenn Sie zum Beispiel verschiedene Fahrzeuge über Ihre Fahrzeugklasse mit einer unterschiedlichen Anzahl von Rädern instanziiert mögen, können Sie in übergeben:

let atv = Vehicle(numberOfWheels: 4, currentSpeed: 20) 
let motorcycle = Vehicle(numberOfWheels: 2, currentSpeed: 40) 

Standardwerten, zu Ihrem Punkt, sind viel schöner, wenn der Wert ist immer gleich als Für alle Klassen muss ein konstanter Wert übergeben werden.

Eine weitere Option ist die Instanziierung und dann Aktualisierung Eigenschaften nach so tun:

let atv = Vehicle() 
atv.numberOfWheels = 4 

aber in der Lage, mit den Parametern initialisiert werden können für eine Vielzahl von Gründen wünschenswert sein:

  1. Sicherheit. Möglicherweise möchten Sie, dass diese Klasseneigenschaften bei der Initialisierung Werte erhalten.

  2. Lesbarkeit. Kompakter.

  3. Flexibilität. Sie können mehrere Komforteinheiten erstellen, um Ihre Fahrzeugklasse mit verschiedenen Parametern zu initialisieren. Say numberOfWheels ist irrelevant, aber Sie möchten mit Farbe initialisieren. Sie können eine Bequemlichkeit init vorstellen, so dass Sie stattdessen wie folgt initialisieren können:

    lassen rainbowVain = Fahrzeug (Farbe: UIColor.White)

Für Ihre erste Initialisierungsmethode, manchmal ist der Code ein bisschen sauberer in diesem Format, insbesondere für ViewControllers.

var description: String { 
    return "traveling at \(currentSpeed) per hour" 
} 

Dies wird in berechnete Eigenschaften, die Sie bei Interesse mehr in Betracht ziehen können. Hoffe das hilft einigen.

+0

Kleine Follow-up-Frage: zwischen der Verwendung von 'let Motorrad = Fahrzeug (..' und eine neue Unterklasse 'Motorrad: Fahrzeug'? –

+0

Es kommt nur darauf an. Eine Regel, die ich im Allgemeinen befolge Unterklassen wenn ich gehe Verwenden Sie es mehr als einmal oder es ist am besten als sein eigenes Objekt für die Lesbarkeit und Code-Organisation dargestellt. Aber eine Menge davon ist einfach Stil und Vorliebe einzigartig für jeden Coder. Also, wenn ich eine Liste von verschiedenen Motorrädern zu vertreten hätte, eine zusätzliche Unterklasse Schicht könnte hier bevorzugt werden. –

+0

Danke Ian. Wenn Sie Codierungsfehler im zweiten Codebeispiel sehen, können Sie gerne kommentieren (noch lernen) –