2015-02-11 8 views
12

Ich habe eine Situation, in der ich binäre Decodierung von einigen Daten versuchen und die Datentypen haben sowohl einen numerischen Wert und einen String-Wert und einen Namen. Ich dachte, der Verwendung eines ENUM wie:Swift Enum sowohl eine Zeichenfolge und eine Int

enum TARGET_TRACK_TYPE : String { 
    case TT_INVALID   = "Invalid" 
    case TT_TRUE_TRACK_ANGLE = "True Track Angle" 
    case TT_MAGNETIC   = "Magnetic" 
    case TT_TRUE    = "True" 
} 

aber ich weiß auch, dass:

TT_INVALID = 0 und TT_TRUE_TRACK_ANGLE = 1 usw. Gibt es eine einfache Möglichkeit, diese beiden „Dinge“ die Zeichenfolge und die numerische einzukapseln Wert in ein Enum-Konstrukt oder muss ich eine Art von Struktur/Klasse machen, um damit umzugehen?

Ich glaube, ich möchte so etwas wie

let a = TARGET_TRACK_TYPE.rawValue(value: 2) println(a)

die wiederum True Track Angle

drucken würde tun, das weiß ich kann mit einer Struktur oder einer Klasse durchgeführt werden, aber ich m speziell interessiert an der enum

Oder für ein anderes Beispiel:

/// Emitter Category is defined in section 3.5.1.10 of the GDL90 Spec 
struct EmitterCategory { 

let category : Int 

func getString() -> String { 

    switch(category) { 
    case 0: 
     return "No aircraft type information"; 
    case 1: 
     return "Light"; 
    case 2: 
     return "Smalle"; 
    case 3: 
     return "Large"; 
    case 4: 
     return "High Vortex Large"; 
    case 5: 
     return "Heavy"; 
    case 6: 
     return "Highly Manuverable"; 
    case 7: 
     return "Rotorcraft"; 
    case 8: 
     return "(Unassigned)"; 
    case 9: 
     return "Glider/sailplane"; 
    case 10: 
     return "Ligther than air"; 
    case 11: 
     return "Parachutist/sky diver"; 
    case 12: 
     return "Ultra light/hang glider/paraglider"; 
    case 13: 
     return "(Unassigned)"; 
    case 14: 
     return "Unmanned aerial vehicle"; 
    case 15: 
     return "Space/transatmospheric vehicle"; 
    case 16: 
     return "(Unassigned)"; 
    case 17: 
     return "Surface vehicle - emergency vehicle"; 
    case 18: 
     return "Surface vehicle - service vehicle"; 
    case 19: 
     return "Point obstacle"; 
    case 20: 
     return "Cluster Obstacle"; 
    case 21: 
     return "Line Obstacle"; 
    default: 
     return "(reserved)"; 
    } 
} 
} 

Gibt es eine Möglichkeit, diese Struktur in ein Enum so umzuformen, dass ich das Enum mit einem ganzzahligen Wert konstruiere, aber ich "lese" das Enum als String? Ich bin mir ziemlich sicher, dass die Antwort nein ist.

+0

Ich verstehe deine Frage nicht, um ehrlich zu sein. Dog.BT und Dog.BULL? 'lass d = Hund (rawValue:" Bulldog ")'? –

+0

Oder meinst du das: http://StackOverflow.com/Questions/24007461/How-to-enumerate-an-enum-with-string-Typ –

+0

ähnlich, aber nicht genau. – Jeef

Antwort

21

Ich denke, das wird es für mich tun. Danke selbst .. :)

protocol GDL90_Enum { 
     var description: String { get } 
} 

enum TARGET_ADDRESS_TYPE : Int, GDL90_Enum { 
    case ADSB_ICAO_ADDRESS = 0 
    case ADSB_SELF_ADDRESS = 1 
    case TISB_ICAO = 2 
    case TISB_TRACK_ID = 3 
    case SURFACE_VEHICLE = 4 
    case GROUND_STATION = 5 

    var description: String { 
     switch self { 
    case .ADSB_ICAO_ADDRESS: 
     return "ADS-B with ICAO address" 
    case .ADSB_SELF_ADDRESS: 
     return "ADS-B with Self-assigned address" 
    case .TISB_ICAO: 
     return "TIS-B with ICAO address" 
    case .TISB_TRACK_ID: 
     return "TIS-B with track file ID" 
    case .SURFACE_VEHICLE: 
     return "Surface Vehicle" 
    case .GROUND_STATION: 
     return "Ground Station Beacon" 
    default: 
     return "Reserved" 
     } 
    } 
} 
+0

Wie greifen Sie darauf zu? – binsnoel

+1

Warum ein benutzerdefiniertes Protokoll erstellen? Sollte 'CustomStringConvertible' nicht gut funktionieren und flexibler sein? – NobodyNada

1

Haben Sie überlegt, ein Wörterbuch zu verwenden?

let targetTrackDict: [Int: String] = 
     [99: "Invalid", 
     1: "True Track Angle", 
     2: "Magnetic", 
     5: "True"] 

Beachten Sie, dass die Nummerncodes nicht geordnet oder zusammenhängend sein müssen. Da in der Deklaration der Typ des Wörterbuchs spezifisch ist, werden viele Warnungen oder Fehler in den folgenden Snippets vermieden.

den Namen für einen Code zu bekommen ist einfach:

var code = 2 
if let name = targetTrackDict[code] { 
    print("\(name) has code \(code)") 
} else { 
    print("\(code) is not a valid track type") 
} 

ich nicht ordentlich Weg, um den Code für einen Namen gefunden haben, aber das tut es:

let magneticCode = targetTrackDict.first(where: 
    {key, value in value == "Magnetic"})?.key 
// returns an optional 

und Sie Würde es natürlich als Funktion verkleiden. Was Sie nicht automatisch erhalten, ist ein interner Name für Ihren Track-Typ, aber brauchen Sie einen? Und die obige Zeile macht es in gewisser Weise für dich.

Verwandte Themen