Swift-Protokoll mit eingeschränkten zugeordneten Typ-Fehler "nicht Cabrio"
Den ich erstellt habe-2-Protokolle mit den dazugehörigen Typen. Ein Typ konform zu Reader
sollten in der Lage sein erzeugen eine Instanz eines Typs gemäß Value
.
Die Ebene der Komplexität kommt ein Typ konform zu Manager
sollte in der Lage sein zu produzieren, die einen konkreten Reader
Instanz, die erzeugt eine spezifische Art von Value
(entweder Value1
oder Value2
).
Mit meinem konkreten Umsetzung von Manager1
ich möchte es für immer zu Reader1
was wiederum Instanzen von Value1
.
Könnte mir jemand erklären, warum
"Reader1 ist nicht konvertierbar ManagedReaderType?"
Wenn die fehlerhafte Zeile ist geändert (jetzt) zurück nil
alles kompiliert Prima, aber jetzt kann ich nicht instanziieren entweder Reader1
oder Reader2
.
Folgende eingefügt werden kann in einen Spielplatz zu sehen der Fehler:
import Foundation
protocol Value {
var value: Int { get }
}
protocol Reader {
typealias ReaderValueType: Value
func value() -> ReaderValueType
}
protocol Manager {
typealias ManagerValueType: Value
func read<ManagerReaderType: Reader where ManagerReaderType.ReaderValueType == ManagerValueType>() -> ManagerReaderType?
}
struct Value1: Value {
let value: Int = 1
}
struct Value2: Value {
let value: Int = 2
}
struct Reader1: Reader {
func value() -> Value1 {
return Value1()
}
}
struct Reader2: Reader {
func value() -> Value2 {
return Value2()
}
}
class Manager1: Manager {
typealias ManagerValueType = Value1
let v = ManagerValueType()
func read<ManagerReaderType: Reader where ManagerReaderType.ReaderValueType == ManagerValueType>() -> ManagerReaderType? {
return Reader1()//Error: "Reader1 is not convertible to ManagedReaderType?" Try swapping to return nil which does compile.
}
}
let manager = Manager1()
let v = manager.v.value
let a: Reader1? = manager.read()
a.dynamicType
- typealias ManagerValueType: der Wert ist falsch - Sie definieren typealias ' es mit "=", wie typealias ManagerValueType = Wert
typealias ManagerValueType: Value
innerhalb des ProtokollsManager
ist eine Einschränkung, Einstellung nicht der Typ.- Ist dieser code nur ein kurzes Beispiel für ein größeres Projekt oder ist es die Neugier, wie dieses problem zu lösen?
- Es ist ein kurzes Beispiel für ein größeres Projekt, während auch versuchen, entdecken Sie die features von Swift. Ich nehme an eine Antwort, die einen alternativen Ansatz, um so etwas wie dieses, oder eine Erklärung, warum der oben nicht funktioniert und mögliche Lösungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tritt der Fehler auf, weil
ManagerReaderType
imread
Funktion ist nur ein generischer Platzhalter, der für jede Art entsprichtReader
und seineReaderValueType
ist gleich dem einesManagerReaderType
. So dass die tatsächliche Art derManagerReaderType
wird nicht bestimmt durch die Funktion selbst, sondern der Typ der Variablen, die zugewiesen bekommt, erklärt der Typ:wenn Sie zurück
nil
es umgesetzt werden kann, um alle optionalen Typ, so dass es immer funktioniert.Als alternative können Sie wieder eine bestimmte Art von Typ
Reader
:Dies ist der beste Ansatz, mit Protokollen durch die fehlende "echte" Generika (das folgende wird nicht unterstützt (noch)):
Also die beste Abhilfe wäre, um
Reader
eine generische Klasse undReader1
undReader2
Unterklasse eine spezielle generische Art der es:Diese Umsetzung sollte Sie lösen problem, aber die
Readers
jetzt sind Referenz-Typen und eine Kopie-Funktion berücksichtigt werden sollten.