【问题标题】:Problems to invoke the default method in protocal extention在协议扩展中调用默认方法的问题
【发布时间】:2016-06-09 21:59:56
【问题描述】:

通过仅在协议扩展中创建方法,可以定义默认方法。 IE。如果方法没有在类型(结构、类和枚举)中实现,那么调用方法实际上就是调用协议扩展中的方法。

TeamRecordPlayoffEligible 是两个协议,通过使用TeamRecord 协议扩展上的类型约束,我将能够在我的扩展实现中使用PlayoffEligible 中的属性minimumWinsForPlayoff

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)

问题:在符合TeamRecord协议的类型创建的对象中找不到函数isPlayoffEligible

问题:如何调用协议扩展中的方法,该方法采用类型约束,使该方法使用另一个协议的属性

非常感谢您的时间和帮助

【问题讨论】:

  • 如果这是您的真实代码,您将遇到麻烦,因为您以两种不同的方式拼写“相同”变量 - minimunWinsForPlayoffminimumWinsForPlayoff
  • @matt,是的,你是对的,我的错。这是一个草率的工作。非常感谢您的详细观察。

标签: xcode swift protocols


【解决方案1】:

您在结构 TeamInGroupA 中找不到 PlayoffEligible 扩展方法,因为 TeamInGroupA 不采用 PlayoffEligible:

struct TeamInGroupA: TeamRecord {

将协议视为强加一种类型层次结构。如果结构采用协议,则它“是”该类型。因此,仅当 TeamInGroupA“是”PlayoffEligible 时,TeamInGroupA 才会具有 PlayoffEligible 扩展方法。但在你的代码中,它不是。

如果您希望 TeamInGroupA 采用 PlayoffEligible,您需要明确说明:

struct TeamInGroupA: TeamRecord, PlayoffEligible {

【讨论】:

  • 嗨,马特,非常感谢您的解释。我现在更明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多