OptionSetType und Enumerationen

Habe ich eine Enumeration namens ProgrammingLanguage:

enum ProgrammingLanguage {
  case Swift, Haskell, Scala
}

Nun habe ich eine Klasse namens Programmer mit der folgenden Eigenschaft:

let favouriteLanguages: ProgrammingLanguage = .Swift

Sehen, wie ein Programmierer könnte mehrere Lieblings-Sprachen, hatte ich gedacht, es wäre schön, etwas zu schreiben wie diese:

let favouriteLanguages: ProgrammingLanguage = [.Swift, .Haskell]

Nach ein bisschen recherche habe ich gemerkt, dass ich zu entsprechen OptionSetType, aber damit habe ich raise die folgenden 3 Fehler:

ProgrammingLanguage nicht entsprechen,

  1. SetAlgebraType
  2. OptionSetType
  3. RawRepresentable

Als ich sah, das Raw Darstellbar Fehler, ich dachte sofort an assoziierten Typen für Enumerationen. Ich wollte in der Lage sein zu drucken, die enum-Wert sowieso nicht, also änderte ich meine enum-Signatur wie folgt:

case ProgrammingLanguage: String, OptionSetType {
  case Swift, Haskell, Scala
}

Diese zum schweigen gebracht 2 Warnungen. Aber ich bin immer noch Links mit ein, die ist, dass ich nicht entsprechen-Protokoll SetAlgebraType.

Nach ein bisschen von Versuch und Irrtum, fand ich heraus, dass der zugehörige Typ der enum als Int es behoben (was Sinn macht, da die RawRepresentable - Protokoll erfordert die Implementierung einer Initialisierung der Signatur init(rawValue: Int)). Allerdings bin ich unzufrieden mit diesem, ich möchte in der Lage sein, um die String-Darstellung der enum-leicht.

Könnte jemand mir raten, wie kann ich dies leicht tun, und warum OptionSetType erfordert eine Int Zusammenhang geben?

Edit:

Folgende Erklärung richtig kompiliert, aber Fehler zur Laufzeit:

enum ProgrammingLanguage: Int, OptionSetType {
  case Swift, Scala, Haskell
}

extension ProgrammingLanguage {
  init(rawValue: Int) {
    self.init(rawValue: rawValue)
  }
}

let programmingLanguages: ProgrammingLanguage = [.Swift, .Scala]
  • Ich bezweifle, dass Sie kombinieren können enum und OptionSetType weil beide rawValue's sich gegenseitig stören.
  • Es ist wirklich interessant, dass es richtig kompiliert. Beim ausführen stürzt die app auf die Zeile, die versucht, die init-option, mit der debugger zeigt die init aufgerufen 31970 mal vor dem Absturz.
  • Ich denke, der code läuft in einer endlos-Schleife (welche ist egal, zur compile-Zeit) oder etwas ähnliches, und dann stürzt auf einem buffer overflow.
  • Ich glaube, du verwechselst associated values mit raw values: developer.apple.com/library/content/documentation/Swift/...
  • im Zusammenhang twitter.com/johnsundell/status/906097785883242496
InformationsquelleAutor Kelvin Lau | 2016-04-24
Schreibe einen Kommentar