2017-12-02 2 views
0

私はGameクラスを持っています。私はそれを一般的にしました。なぜなら、さまざまなタイプのボードをサポートする必要があったからです。ここでは、古典的なiOSスタイルのデリゲートをゲームに追加するメソッドと新しいポイントの値をパラメータとして追加したいだけです。どのようにスウィフトassociatedtype方法でこれを達成するには?私は本当にそのような単純な論理を打ち消すことはできないと私は混乱しました。汎用タイプの代理プロトコルでassociatedtypeを使用

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

関連する型を削除して、汎用関数 'game'を使用することは可能でしょうか? – Qbyte

+0

'GamePointsDelegate'は型ではないので、' GamePointsDelegate'型の 'var pointsDelegate'を持つことはできません。これは型のテンプレートのようなもので、 'B'のすべての値に対して新しい型を生成します。 – Alexander

+0

@アレクサンダー、分かります。しかし、私はすでに 'ゲーム'に 'B'を持っていて、何とか使ってみたい。 – kelin

答えて

1

あなたのプロトコルから関連するタイプの要件を削除し、代わりに汎用的な機能gameを使用することができます。

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

ことがあるが、欠点があることであるように、あなたのGameクラスのコードを使用することができますプロトコルに従うクラスはすべてBoardを処理しなければなりません。

+1

これは私に警告を与えます: "冗長適合性制約 'B': 'ボード'"。しかし、私が「Board」をジェネリック宣言から削除すると、すべてがコンパイルされます。ありがとう! – kelin

関連する問題