2017-01-05 4 views
2

ich folgenden Grund Enum habe:Kann nicht Swift Enum Extend

enum Voicity {} 

Auf verschiedene Dateien, ich habe die oben Enum erweitere verschiedene Funktionen und Informationen zu speichern, die durch meine Anwendung als eine Zentralstation verwendet wird, .

Zum Beispiel verwende ich diese Enumeration, um meine UI-Elemente programmgesteuert zu erstellen.

extension Voicity { 
    enum sectionObject { 
     case textField(ofType: Voicity.UIElement.textField) 
     case button(ofType: Voicity.UIElement.button) 
     case label(ofType: Voicity.UIElement.label) 
     case line() 
     case photoCircle 
     case stackView(_: UIStackView) 
     case view(_: UIView) 

     var item: UIView { 
      switch self { 
      case .textField(let type): 
       return createTextField(ofType: type) 
      case .label(let type): 
       return createLabel(ofType: type) 
      case .line(): 
       return createLine() 
      case .photoCircle: 
       return createPhotoCircle() 
      case .stackView(let view): 
       return view 
      case .view(let view): 
       return view 
      case .button(let type): 
       return createButton(ofType: type) 
      } 
     } 
    } 
} 

Zur besseren Lesbarkeit/Wartbarkeit, trennte ich die zurückgegebenen Funktionen, die oben in einzelne Dateien als auch durch wieder zur Verlängerung des sectionObject Enum.

extension Voicity.sectionObject { 
    func createLabel(ofType type: Voicity.UIElement.label) -> UILabel { 
     // implementation here 
    } 
} 

Die oben genannten Arbeiten gut, aber wenn ich versuche, die createButton() zu erklären:

extension Voicity.sectionObject { 
    func createButton(ofType type: Voicity.UIElement.button) -> UIButton { 
     // implementation here 
    } 
} 

ich die folgende Fehlermeldung erhalten:

sectionObject is not a member of Voicity.

Warum kann ich nicht meine Enum auf eine Datei erweitern, wenn ich dies in einer anderen Datei tun kann?

aktualisieren

createButton() und createLabel() Methoden sind sowohl innerhalb als Gruppe/Ordner Model.

Die enum-Deklarationen sind in Gruppe/Ordner Store.

Also sind sie getrennt. Aber es erstaunt mich, dass createLabel() funktioniert, wenn createButton() nicht kann.

Es hat alles funktioniert (Methoden in verschiedenen Dateien), wenn meine Enum Fälle alle in einer einzigen Datei wieder unter Gruppe/Ordner Store und Methoden unter Gruppe/Ordner Model waren. Ich musste meine Enum-Fälle umgestalten, wenn sie vergrößert wurden.

Außerdem habe ich gerade jetzt versucht, createButton() innerhalb der Erweiterung zu deklarieren createLabel(). Und alles funktioniert aus irgendeinem Grund.

Zuvor löschte ich die Datei, die die createButton() Methode deklariert und neu erstellt und alles ist das gleiche. Daher ist es kein seltsames Xcode-Problem.

+2

Vielleicht ist es eine Frage des Zugriffsmodifikators. Es sollte standardmäßig auf interne Standard, so sollte es zugänglich sein Paket weit o.0 – Alexander

+2

Mit Alexander Idee: Sind diese beiden Erweiterungen in der gleichen Datei? Wenn nicht, sind sie sicher im selben Modul? – HAS

+0

@Alexander Bitte beachten Sie die Update ... –

Antwort

0

Ich fand die Lösung here (nkukushkins Antwort).

Das Problem

hatte ich die Idee, dass es sich um eine Zusammenstellung Ordnung Problem war, dachte aber, dass Xcode es automatisch von selbst Handhabung wäre. Deshalb habe ich mir nicht einmal die Mühe gemacht, zu meinen Projekteinstellungen zu gehen. Es stellt sich heraus, dass es nicht immer so ist.

Wie

  1. Wählen Sie ein Projekt lösen,
  2. Wählen Sie ein Ziel,
  3. Zum Build Phases ist Ihr Ziel,
  4. Compile Sources verlängern.

Xcode Project Settings | Target Build Phases | Compile Sources

Hier sehen sie eine Liste der Dateien in Ihrem Projekt zusammengestellt werden.

In meinem Fall wurde die Datei, die ich ursprünglich definiert hatte, sectionObject unter den Dateien aufgelistet, die ich diese Enum erweitert habe. Daher musste ich die Definitionsdatei nach oben verschieben, damit die Erweiterungen sie sehen können.

Leider Xcode (8.2.1 (8C1002)) Drag-n-Drop nicht zulassen. Ich musste die Datei entfernen und neu hinzufügen, durch die Plus-/Minuszeichen unter der Compile Sources Liste. Sobald Sie es erneut hinzufügen, wird es oben aufgeführt.