我目前正在写在迅速一场比赛,我试图让使用协议来定义的东西,如章节和水平等与成员斯威夫特协议,是“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章可能有实现选择的Chapter1Choices。所以我知道他们都符合相同的界面,但每个章节的价值都会有所不同。那么名称可能会有所不同,但值将全部是位,例如1,2,4,8等 – TommyBs
可能'OptionSet'不是一个好选择,因为通常会为选项添加一堆'static let'声明。如果你不能枚举它们,或者你找不到适用于所有章节的集合,那么你可能需要一个不同的抽象。 – GoZoner
嗯,我认为你是对的,也许我应该把它们想象成布尔标志并在字典中指定它们。然后每个级别可以指定什么需要是“真实的”。尽管使用'分数'作为id是很好的,所以玩家可以'跳过'关卡,但我想我可以通过循环所有选项并检查设置来达到类似的效果。只是会有点慢 – TommyBs