Swift 与 'ObjectSetType' 成员的协议
Swift protocol with member that is of 'ObjectSetType'
我目前正在 swift 中编写游戏,我正在尝试使用协议来定义章节和级别等内容。
因此一章可能具有以下结构:
protocol Chapter {
var title:String {get}
var levels:[Level] {get}
var choices:[OptionSetType]
}
每个章节由多个级别组成,只有满足某些 'choices' 条件才能访问每个级别。
为此,我将跟踪这些选择并使用位掩码来查看是否满足条件。然而,每个章节的选择可能不同,但我想构建我的游戏机制,这样他们就不必担心弄清楚用户实际在哪个章节。
每个级别都有一个 '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 类型时,我如何才能进行位掩码工作。希望这是有道理的?
[在Swift 3中,OptionSetType
现在是OptionSet
。]你的错误发生是因为OptionSet
是一个协议,不能直接使用(它'有 Self
或 ... 要求)。
您的设计可能会通过为 Choice
和 Score
创建抽象而受益——就像您为 Level
创建抽象一样。然后,如果您选择将 Score
实现为 OptionSet
,则会满足 'self requirement'。像这样:
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}
}
我目前正在 swift 中编写游戏,我正在尝试使用协议来定义章节和级别等内容。
因此一章可能具有以下结构:
protocol Chapter {
var title:String {get}
var levels:[Level] {get}
var choices:[OptionSetType]
}
每个章节由多个级别组成,只有满足某些 'choices' 条件才能访问每个级别。
为此,我将跟踪这些选择并使用位掩码来查看是否满足条件。然而,每个章节的选择可能不同,但我想构建我的游戏机制,这样他们就不必担心弄清楚用户实际在哪个章节。
每个级别都有一个 '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 类型时,我如何才能进行位掩码工作。希望这是有道理的?
[在Swift 3中,OptionSetType
现在是OptionSet
。]你的错误发生是因为OptionSet
是一个协议,不能直接使用(它'有 Self
或 ... 要求)。
您的设计可能会通过为 Choice
和 Score
创建抽象而受益——就像您为 Level
创建抽象一样。然后,如果您选择将 Score
实现为 OptionSet
,则会满足 'self requirement'。像这样:
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}
}