【问题标题】:Swift protocol with member that is of 'ObjectSetType'具有“ObjectSetType”成员的 Swift 协议
【发布时间】:2016-07-22 14:58:36
【问题描述】:

我目前正在用 swift 编写游戏,我正在尝试使用协议来定义诸如章节和关卡等内容。

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

   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

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

【问题讨论】:

    标签: swift bit-masks optionsettype


    【解决方案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}
    }
    

    【讨论】:

    • 这是否适用于每个章节的选择应该不同的事实?我必须预先声明所有选项。而更像是每章都有选择,但第 1 章可能有实现选择的 Chapter1Choices。所以我知道它们都满足相同的界面,但每章的值会有所不同。好吧,名称会有所不同,但值都是位,例如 1,2,4,8 等
    • OptionSet 可能不是一个好的选择,因为通常会为选项添加一堆 static let 声明。如果您无法枚举它们,或者找不到适用于所有章节的集合,那么您可能需要不同的抽象。
    • 嗯,我认为你是对的,也许我应该将它们视为布尔标志并在字典中以这种方式指定它们。然后每个级别都可以指定需要“真实”的内容。虽然使用“分数”作为 id 会很好,因此玩家可以“跳过”关卡,但我想我可以通过循环所有选项并检查设置的内容来实现类似的效果。只是会慢一点
    猜你喜欢
    • 2017-10-08
    • 2018-12-31
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多