2017-04-06 3 views
2

Ich versuche nil für Null Indexelement zu haben und Ruhe wird Wert von Generic Typ T haben, die Comparable ist.Wie Swift-Array mit Null initialisiert werden

Also, wenn ich initialisiert wird es nil es

struct Container<T: Comparable> { 
    var container = [T?]() 

    init() { 
     container.append(nil) 
    } 
} 

wie erwartet funktioniert, aber wenn ich es mit einer ganzen Zahl zu tun sagen 0, bekomme ich ambiguous reference

struct Container<T: Comparable> { 
    var container = [T?]() 

    init() { 
     container.append(0) 
    } 
} 

Playground execution failed: error: Algorithms.playground:7:9: error: ambiguous reference to member 'append' 
     container.append(0) 
     ^~~~~~~~~ 

ich, warum diese Fehler verstehen will tritt auf?

+1

'T' ist nicht notwendig,' Int' - es könnte sein, 'String' und '0' nicht hinzugefügt werden kann, ein' [ String?] '. – Hamish

Antwort

1

T kann durch jede vergleichbare Art (String, eine benutzerdefinierte Typ, ...), und von 0 Initialisierung ist im allgemeinen nicht möglich.

Sie könnten verlangen, dass T kann aus einem Ganzzahlliteral erstellt werden, dies umfasst alle Integer- und Floating-Point-Typen:

struct Container<T: Comparable> where T: ExpressibleByIntegerLiteral { 
    var container = [T?]() 

    init() { 
     container.append(0) 
    } 
} 

oder eine separate append() Methode bieten:

struct Container<T: Comparable> { 
    var container = [T?]() 

    init() { 
     container.append(nil) 
    } 

    mutating func append(_ newElement: T) { 
     container.append(newElement) 
    } 
} 

var c = Container<Int>() 
c.append(0) 
+0

verhindert dies nicht den Zweck, Container als generischen Typ zu haben? –

+0

@RajeevBhatia: Es ist immer noch generisch, nur für eine begrenzte Reihe von Typen. Wenn Sie es nicht einschränken, macht 'append (0)' keinen Sinn. –

+0

@MartinR Ich dachte, Array sollte Append-Methode haben, und wenn ich T-Typ-Literal zur Verfügung stelle, dann sollte es sich so verhalten, wie es sollte. – Rahul

2

Die Frage ist das T: Comparable bedeutet nicht unbedingt Int, es bedeutet ANY-Wert, der Comparable entspricht, die String, Float, 012 enthält, und die Tausende von benutzerdefinierten Strukturen, die andere Programmierer für ihre eigenen Projekte geschrieben haben.

Da 0 ist kein gültiger Wert für alle diese Structs, Sie im Wesentlichen eine von zwei Probleme haben:

1) Muss ich eigentlich nur die Container wollen immer Int verwenden - in diesem Fall:

struct Container 
{ 
    var container: [Int?] 

    init() 
    { 
     container = [nil] 
    } 
} 

var a = Container() 
a.container.append (0) 

2) Warum ich 0 verwende, wenn ich meine nil

struct Container<T: Comparable> 
{ 
    var container: [T?] 

    init() 
    { 
     container = [nil] 
    } 
} 

var a = Container<Int>() 
a.container.append (0) 
Verwandte Themen