2016-06-25 10 views
-1

Ich habe diese Art von Code:Swift-Protokoll als generische Typ

protocol MyProtocol { 
} 

class P1: MyProtocol { 
} 

class P2: MyProtocol { 
} 

class C <T: MyProtocol> { 
} 

Dann muss ich eine Variable definieren alle Arten von C<MyProtocol> zu delegieren:

var obj: C <MyProtocol> 

Aber kompilieren Fehler kommt:

Verwenden von 'MyProtocol' als konkreter, dem Protokoll entsprechender Typ 'MyProtocol' wird nicht unterstützt

Wie kann ich tun?

Antwort

0

Normalerweise müssen Sie den Typ für eine Swift-Variable nicht deklarieren. Der Compiler kann in den meisten Fällen auf den Typ schließen. Auch für generische Klasse, sollten Sie die Compiler herauszufinden lassen, was die generischen Klassen lösen zu:

class C<T: MyProtocol> { 
    var value: T 

    init (value: T) { 
     self.value = value 
    } 
} 

var obj = C(value: P1()) // type: C<P1> 
// or: 
var obj = C(value: P2()) // type: C<P2> 
+0

Vielen Dank für Ihre Antwort, ich brauche ein Array, um die Instanzen der Klasse C zu speichern. var array = [C ](), aber dies wird auch kompiliert Fehler. Wie kann ich das machen? – chk58

1

Diesen Code:

class C <T: MyProtocol> { } 

Bedeutet, dass C eine generische Klasse, die auf jeder Art spezialisieren T, die entsprichtMyProtocol.

Wenn Sie erklären:

var obj: C <MyProtocol> 

Sie sind (glaube ich) versuchen, die var obj eine Instanz von C auf irgendeine Art spezialisiert sein wird, die, zu sagen, dass zu MyProtocol entspricht aber Sie nicht spezialisieren generische Klasse für einen Protokolltyp, da es keine direkte konkrete Instanz eines Protokolls gibt. Es kann nur Instanzen eines Typs konform zu zum Protokoll geben. Und es kann theoretisch viele verschiedene Typen geben, die dem Protokoll entsprechen. Diese Notation sagt dem Compiler nicht wirklich, welche spezielle Spezialisierung von C zu verwenden ist.

Dies sollte aber kein Problem sein, weil man Dinge wie schreiben:

var obj: C<P1> = C<P1>() 

oder

var obj = C<P2>() // type is inferred 

Und in Ihrer Klasse C Sie noch irgendwelche Verwendungen von T behandeln kann als konform zu MyProtocol. Ich denke, das sollte Ihnen alles geben, was Sie brauchen, solange Sie sich daran erinnern, dass eine Instanz einer generischen Klasse auf einen bestimmten konkreten Typ spezialisiert sein muss, nicht ein Protokoll, das viele mögliche konkrete Typen repräsentieren könnte.

Verwandte Themen