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 Protokolls Manager 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.
InformationsquelleAutor Jay | 2015-08-01
Schreibe einen Kommentar