2016-07-14 10 views
0

Was ist falsch an der Codezeile, wenn ich die Variable item2 einstelle und warum diese Initialisierung nicht möglich ist, wenn die name -Eigenschaft optional ist?Ändern eines optionalen Eigenschaftswerts mithilfe eines Standardinitialisierers in Swift 3

class ShoppingListItem { 
    var name: String? 
    var quantity = 1 
    var purchased = false 
} 

var item = ShoppingListItem() 
var item2 = ShoppingListItem(name:"Orange Juice") 

print(item.name) 
print(item2.name) 
+2

Betreffend das optionale: Im wirklichen Leben, wie viele namenlose Einkaufsliste Elemente gibt es? ;-) – vadian

Antwort

3

Mit diesem Code

ShoppingListItem(name:"Orange Juice") 

Sie einen Initialisierer von ShoppingListItem sich berufen, die nicht existiert.

So definieren nur die initializer in die Klasse

class ShoppingListItem { 
    var name: String? 
    var quantity = 1 
    var purchased = false 

    init(name:String) { 
     self.name = name 
    } 

    init() { } 
} 
1

Memberwise Initializers for Structure Types

Strukturtypen ein element initializer automatisch erhalten, wenn sie alle ihre eigenen benutzerdefinierten initializers nicht definieren tun. Im Gegensatz zu einem Standardinitialisierer empfängt die Struktur einen Memberwise-Initialisierer, auch wenn Eigenschaften gespeichert hat, die keine Standardwerte haben.

Der Memberwise-Initialisierer ist eine Kurzform, um das Element Eigenschaften von neuen Strukturinstanzen zu initialisieren. Anfangswerte für die Eigenschaften der neuen Instanz können an den Memberwise-Initiator mit Namen übergeben werden.

Das folgende Beispiel definiert eine Struktur namens Size mit zwei Eigenschaften namens Breite und Höhe. Es wird angenommen, dass beide Eigenschaften vom Typ Double sind, indem Sie einen Standardwert von 0,0 zuweisen.

Die Größenstruktur erhält automatisch eine init (Breite: Höhe :) element initializer, mit dem Sie eine neue Größe Instanz verwenden können, initialisieren:

struct Size { 
    var width = 0.0, height = 0.0 
} 

let twoByTwo = Size(width: 2.0, height: 2.0) 
+0

Bitte fügen Sie etwas zu diesem Beitrag hinzu. –

+0

Jede Antwort ist direkt aus der Swift-Dokumentation. Sogar der Code der Frage befindet sich in der Dokumentation. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html – Asdrubal

+2

Die angenommene Antwort verwendet den Code von der Frage plus eine Erklärung, die vom Plakat geschrieben wird. Dies ist auch die Dokumentation über Strukturen; Der betreffende Code verwendet eine Klasse. –

1

In Ihrem Code Sie initializer hinzufügen müssen oder geben Sie einen Namen nach der Initialisierung:

+0

Tatsächlich weisen Sie nun 'name' einen leeren' String' zu, um die Abwesenheit von Werten darzustellen. Sie sollten immer 'nil' verwenden, um das No-Value-Konzept darzustellen. –

+0

Ja, Sie haben recht, thnx – Igor

+0

Methoden zu haben oder nicht, hat nichts mit der Wahl von 'class' vs.' struct' in Swift zu tun. – andyvn22

Verwandte Themen