2017-12-02 10 views
0

Ich habe eine Game Klasse. Ich habe es generisch gemacht, weil ich verschiedene Arten von Boards unterstützen musste. Jetzt möchte ich nur einen klassischen iOS-Stil-Delegaten mit einer Methode hinzufügen, die ein Spiel und einen neuen Punktewert als Parameter annehmen wird. Wie erreicht man dies in der Swift associatedtype Art und Weise? Ich habe wirklich verwirrt, dass ich solche einfache Logik nicht vorantreiben kann.Verwenden von zugeordneten Typ in einem Delegate-Protokoll für einen generischen Typ

protocol GamePointsDelegate { 
    associatedtype B: Board 
    func game(_ game: Game<B>, didSetPoints points: Int) 
} 

class Game<B: Board> { 
    let board: Board 

    var points = 0 { 
     // Compiler Error 
     // Member 'game' cannot be used on value of protocol type 'GamePointsDelegate'; use a generic constraint instead 
     didSet { pointsDelegate?.game(self, didSetPoints: points) } 
    } 

    // Compiler Error 
    // Protocol 'GamePointsDelegate' can only be used as a generic constraint because it has Self or associated type requirements 
    var pointsDelegate: GamePointsDelegate? 
} 
+0

Wäre es möglich, den zugehörigen Typ zu entfernen und nur eine generische Funktion 'Spiel' zu verwenden? – Qbyte

+0

Sie können kein 'var pointsDelegate' vom Typ' GamePointsDelegate' haben, weil 'GamePointsDelegate' kein Typ ist. Es ist wie eine Vorlage für einen Typ, der für jeden möglichen Wert von "B" einen neuen Typ erzeugt. – Alexander

+0

@Alexander, ich verstehe. Aber ich habe bereits 'B' in' Game' und ich möchte das irgendwie benutzen. – kelin

Antwort

1

Sie könnten die zugehörigen Typ Anforderung aus dem Protokoll zu entfernen und verwenden, um eine generische Funktion game statt:

protocol GamePointsDelegate { 
    func game<B>(_ game: Game<B>, didSetPoints points: Int) 
} 

So können Sie den Code Ihrer Game Klasse verwenden, wie es ist, aber der Nachteil ist, dass die Klasse, die dem Protokoll entspricht, muss alle Board s handhaben.

+1

Dies gibt mir eine Warnung: "Redundante Conformance Constraint 'B': 'Board'". Aber wenn ich 'Board' aus der generischen Deklaration entferne, kompiliert alles. Vielen Dank! – kelin

Verwandte Themen