2016-07-22 28 views
3

我目前正在写在迅速一场比赛,我试图让使用协议来定义的东西,如章节和水平等与成员斯威夫特协议,是“ObjectSetType”

所以一个章节可能具有以下结构:

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

每个章节由多个级别组成,每个级别只有在某些'选择'被满足时才能被访问。

要做到这一点,我会跟踪这些选择并使用位掩码来查看是否满足条件。然而,每个章节的选择可能不同,但我想要构建自己的游戏机制,以便他们不必担心如何确定用户实际使用的章节。

这个想法是,每个级别都有一个“点”值,如果点值包含相关的选择位掩码,我就算出来。

因此,对于“等级”我试图定义一个协议,如

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 

错误现在每个章节都会在理论上有它自己的一套方案,但我想知道如何才能使这个通用性足够好,这样我几乎可以对引擎进行编码,而不是编码到每个特定的章节。这就是为什么我认为我会创建协议。麻烦的是,当我需要定义Set OptionSetType值并且不能说属性将是一种OptionSetType类型时,我该如何进行位掩码工作。希望这是有道理的?

回答

1

[在夫特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} 
} 
+0

将这项工作的事实,选择应该是每章有什么不同?我必须预先声明所有选项。而更像每个章节都有选择,但第1章可能有实现选择的Chapter1Choices。所以我知道他们都符合相同的界面,但每个章节的价值都会有所不同。那么名称可能会有所不同,但值将全部是位,例如1,2,4,8等 – TommyBs

+0

可能'OptionSet'不是一个好选择,因为通常会为选项添加一堆'static let'声明。如果你不能枚举它们,或者你找不到适用于所有章节的集合,那么你可能需要一个不同的抽象。 – GoZoner

+0

嗯,我认为你是对的,也许我应该把它们想象成布尔标志并在字典中指定它们。然后每个级别可以指定什么需要是“真实的”。尽管使用'分数'作为id是很好的,所以玩家可以'跳过'关卡,但我想我可以通过循环所有选项并检查设置来达到类似的效果。只是会有点慢 – TommyBs