在通用类型的委托协议中使用associatedtype

我有一个Game类。我说它是通用的,因为我需要支持不同类型的电路板。现在我只想添加一个经典的iOS风格的委托,其方法是将一个游戏和一个新的积分值作为参数。如何在Swift 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?

}

回答:

你可以从协议中删除相关类型的要求,使用一个通用的功能game代替:

protocol GamePointsDelegate { 

func game<B>(_ game: Game<B>, didSetPoints points: Int)

}

所以,你可以用你的Game类的代码,因为它是,但缺点是,符合协议的类必须处理所有的Board

以上是 在通用类型的委托协议中使用associatedtype 的全部内容, 来源链接: utcz.com/qa/258255.html

回到顶部