具有'ObjectSetType'成员的Swift协议

时间:2016-07-22 14:58:36

标签: swift bit-masks optionsettype

我目前正在快速编写游戏,我正在尝试使用协议来定义章节和级别等内容。

所以章节可能有以下结构:

   protocol Chapter {
       var title:String {get}
       var levels:[Level] {get}
       var choices:[OptionSetType]
   }

每个章节由多个级别组成,只有在满足某些“选择”的情况下才能访问每个级别。

为了实现这一点,我将跟踪这些选择并使用位掩码来查看是否满足条件。然而,每个章节的选择可能不同,但我想建立我的游戏机制,这样他们就不必担心用户实际上在哪个章节。

这个想法是每个级别都有一个'Points'值,如果Points值包含相关的选择位掩码,我就会解决这个问题。

因此,对于'Level',我试图定义一个协议,例如

   protocol Level {
    var text:String {get}
    var score:OptionSetType {get} // this is what determines if a level can be shown if the right chapter 'choices' have been set
   }

给出错误

 Protocol 'OptionSetType' can only be used as a generic constraint because it has Self or associated type requirements

现在每一章理论上都有它自己的一套选项,但是我想知道如何使这个通用足够通用,这样我几乎可以围绕这个编码引擎,而不是编码到每个特定的章节。这就是为什么我认为我会创建协议。问题是当我需要定义设置OptionSetType值时如何进行位屏蔽工作,并且不能说属性将是OptionSetType类型。希望有道理吗?

1 个答案:

答案 0 :(得分:1)

[在Swift 3中,OptionSetType现在是OptionSet。]您的错误发生是因为OptionSet是协议而无法直接使用(它有Self或......要求)。

通过为ChoiceScore创建抽象,您的设计可能会受益 - 就像您为Level创建抽象一样。然后,如果您选择将Score实施为OptionSet,则会满足“自我要求”。像这样:

struct Score : OptionSet { ... }
struct Choice : OptionSet { ... }

然后:

protocol Chapter {
  var title:String {get}
  var levels:[Level] {get}
  var choices:[Choice]
}

protocol Level {
  var text:String {get}
  var score:Score {get}
}