通过仅在协议扩展中创建方法,可以定义默认方法。即如果方法没有在类型(Structure,Class和Enum)中实现,那么调用该方法实际上是调用协议扩展中的方法。
TeamRecord
和PlayoffEligible
是两个协议,通过在TeamRecord
的协议扩展上使用类型约束,我将能够使用{{1}中的属性minimumWinsForPlayoff
在我的扩展程序的实现中。
PlayoffEligible
问题:我找不到符合protocol TeamRecord {
var wins: Int { get }
var losses: Int { get }
}
protocol PlayoffEligible {
var minimumWinsForPlayoff: Int{ get }
}
extension TeamRecord where Self: PlayoffEligible {
func isPlayoffEligible() -> Bool {
return self.wins > minimumWinsForPlayoff
}
}
struct TeamInGroupA: TeamRecord{
var wins: Int
var losses: Int
var minimunWinsForPlayoff: Int
}
let BasketBallLA = TeamInGroupA(wins: 19, losses: 20, minimunWinsForPlayoff: 10)
协议的类型所创建的对象内的函数isPlayoffEligible
问题:如何调用协议扩展中的方法,该方法使用类型约束,该方法使用来自其他协议的属性
非常感谢你的时间和帮助
答案 0 :(得分:2)
您在struct TeamInGroupA中找不到PlayoffEligible扩展方法,因为TeamInGroupA不采用PlayoffEligible:
struct TeamInGroupA: TeamRecord {
将协议视为强加一种类型层次结构。如果一个struct采用一个协议,它就是那个类型。因此,仅当TeamInGroupA“是”PlayoffEligible时,TeamInGroupA才会有PlayoffEligible扩展方法。但是在你的代码中,它不是。
如果您希望TeamInGroupA采用PlayoffEligible,您需要明确说明:
struct TeamInGroupA: TeamRecord, PlayoffEligible {