У меня есть перечисление с именем ProgrammingLanguage
:
enum ProgrammingLanguage {
case Swift, Haskell, Scala
}
Теперь у меня есть класс с именем Programmer
со следующим свойством:
let favouriteLanguages: ProgrammingLanguage = .Swift
Увидев, как программист может иметь несколько любимых языков, я подумал, что было бы неплохо написать что-то вроде этого:
let favouriteLanguages: ProgrammingLanguage = [.Swift, .Haskell]
После небольшого исследования я понял, что мне нужно соответствовать OptionSetType
, но при этом я вызываю следующие 3 ошибки:
ProgrammingLanguage не соответствует
-
SetAlgebraType
-
OptionSetType
-
RawRepresentable
Когда я увидел ошибку Необработанное представление, я сразу же подумал о связанных типах для перечислений. Я хотел иметь возможность печатать значение перечисления в любом случае, поэтому я изменил свою подпись перечисления на следующее:
case ProgrammingLanguage: String, OptionSetType {
case Swift, Haskell, Scala
}
Это застало 2 предупреждения. Но я все еще остаюсь с тем, что я не согласен с протоколом SetAlgebraType
.
После нескольких проб и ошибок я обнаружил, что связанный тип перечисления как Int
исправил его (что имеет смысл, так как протокол RawRepresentable
требует, чтобы вы реализовали инициализатор подписи init(rawValue: Int)
). Однако я не удовлетворен этим; Я хочу, чтобы можно было легко получить строковое представление перечисления.
Может ли кто-нибудь сообщить мне, как я могу сделать это легко, и почему OptionSetType
требует связанный тип Int
?
Edit:
Следующее объявление компилируется правильно, но ошибки во время выполнения:
enum ProgrammingLanguage: Int, OptionSetType {
case Swift, Scala, Haskell
}
extension ProgrammingLanguage {
init(rawValue: Int) {
self.init(rawValue: rawValue)
}
}
let programmingLanguages: ProgrammingLanguage = [.Swift, .Scala]