我有一个名为ProgrammingLanguage
的枚举:
enum ProgrammingLanguage {
case Swift, Haskell, Scala
}
现在我有一个名为Programmer
的类,它具有以下属性:
let favouriteLanguages: ProgrammingLanguage = .Swift
看到程序员可能有多个喜爱的语言,我想写点类似这样的东西:
let favouriteLanguages: ProgrammingLanguage = [.Swift, .Haskell]
经过一番调查,我意识到需要符合 OptionSetType
,但是这样做,出现了以下3个错误:
编程语言不符合
SetAlgebraType
OptionSetType
RawRepresentable
当我看到原始可表示性(Raw Representable)的错误时,我立刻想到了枚举的关联类型。无论如何,我都想能够打印枚举值,因此我将枚举签名更改为以下内容:
case ProgrammingLanguage: String, OptionSetType {
case Swift, Haskell, Scala
}
这样做消除了其中的两个警告。但我仍然面临一个问题,即我不符合协议SetAlgebraType
。
经过一番试错,我发现将枚举的关联类型设置为Int
可以解决问题(这很有道理,因为RawRepresentable
协议要求您实现带有init(rawValue: Int)
签名的初始化器)。但是,我对此不满意;我希望能够轻松地获取枚举的字符串表示。
请问有人能指导我如何轻松地做到这一点,以及为什么OptionSetType
需要一个Int
的关联类型?
编辑:
以下声明可以正确编译,但在运行时出现错误:
enum ProgrammingLanguage: Int, OptionSetType {
case Swift, Scala, Haskell
}
extension ProgrammingLanguage {
init(rawValue: Int) {
self.init(rawValue: rawValue)
}
}
let programmingLanguages: ProgrammingLanguage = [.Swift, .Scala]
enum
和OptionSetType
结合起来,因为它们的rawValue
相互干扰。 - vadianassociated values
和raw values
混淆了:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html#//apple_ref/doc/uid/TP40014097-CH12-ID148 - Sajjon