2016-04-20 4 views
0
protocol TrackableAction { 

    var identifier: String { get } 

} 

struct ServerAction: TrackableAction { 

    let identifier = "Server" 

    enum Label: String { 

     case NotImplemented = "Feature not implemented" 
     case NotPlanned = "Feature is not planned in this version" 

    } 

    var label: Label 

} 

struct ClientAction: TrackableAction { 

    let identifier = "Client" 

    enum Label: String { 

     case NoneExisting = "Does not exist" 
     case CannotFindRoot = "The root was unknown" 

    } 

    var label: Label 

} 

Nutzung:Wie definiert man ein Protokoll, das eine Enumeration mit selbstdefinierten Werten enthält und eine davon als Attribut speichert?

ServerAction(label: .NotImplemented) 
ClientAction(label: .NoneExisting) 

Ist es möglich, die TrackableAction zu erweitern die duplizierte Enum und Label-Definition aufgenommen haben?

Ich möchte diese in der Lage sein, Objekte dieses Typs

func log(trackableAction: TrackableAction) { 
    // sends strings to a log service 
    print(trackableAction.label) // ERROR 

} 
+0

Wenn Sie Enum innerhalb von Protokoll erklären wollen geerbt schicken Du kannst nicht. –

+1

Eine Lösung, die ich hier sehe, ist, Enums ganz zu entfernen, "Label" als "String" zu deklarieren und es zum Protokoll zu bewegen. –

Antwort

6
protocol TrackableAction { 

    var identifier: String { get } 
    var label: Label {get set} 
    associatedtype Label: RawRepresentable 
} 

struct ServerAction: TrackableAction { 

    let identifier = "Server" 

    enum Label: String { 

    case NotImplemented = "Feature not implemented" 
    case NotPlanned = "Feature is not planned in this version" 

    } 

    var label: Label = Label.NotImplemented 

} 

func log<T: TrackableAction>(trackableAction: T) { 
    // sends strings to a log service 
    print(trackableAction.label) // ERROR 
} 
+0

Sieht wirklich vielversprechend aus, aber ich kann TrackableAction nicht als Parameter an die 'func log (trackableAction: TrackableAction) {' Methode mit dieser Lösung senden – hakonbogen

+0

Oh, sorry hab das nicht gesehen, yeah Ich machte das gleiche haha ​​:) – user4478383

-2

Beispiel des Protokolls auf eine Funktion von Enum

protocol validator{ 

     var id : String{ get } 
    } 

    enum testEnum: validator{ 
     case african 
     case european 
     case unknown 

     var id: String{ 

      return self.getDescription() 
     } 
     func getDescription() -> String{ 
      switch self { 
      case .african: 
       return "African" 
      case .european: 
       return "European" 
      default: 
       return "Unknown" 

      } 
     } 
    } 

    var c = testEnum.african 
    let cDescription = c.id