【发布时间】:2016-08-17 13:55:39
【问题描述】:
我有一个名为ProgrammingLanguage的枚举:
enum ProgrammingLanguage {
case Swift, Haskell, Scala
}
现在我有一个名为 Programmer 的类,具有以下属性:
let favouriteLanguages: ProgrammingLanguage = .Swift
看到程序员可以拥有几种最喜欢的语言,我想写这样的东西会很好:
let favouriteLanguages: ProgrammingLanguage = [.Swift, .Haskell]
经过一番研究,我意识到我需要遵守OptionSetType,但在这样做时,我提出了以下3个错误:
ProgrammingLanguage 不符合
-
SetAlgebraType -
OptionSetType RawRepresentable
当我看到 Raw Representable 错误时,我立即想到了枚举的关联类型。无论如何,我希望能够打印枚举值,所以我将我的枚举签名更改为以下内容:
case ProgrammingLanguage: String, OptionSetType {
case Swift, Haskell, Scala
}
这使 2 个警告静音。但是我仍然有一个不符合协议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会互相干扰。 -
@vadian 它编译正确真的很有趣。运行时,应用程序在尝试初始化选项集的行崩溃,调试器显示在崩溃前调用了 31970 次 init。
-
我猜代码会陷入无限循环(在编译时并不重要)或类似情况,然后在缓冲区溢出时崩溃。
-
我相信你把
associated values和raw values混淆了:developer.apple.com/library/content/documentation/Swift/…
标签: swift enums optionsettype