2016-07-31 14 views
0

Ich lerne über Protobuf und spiele mit alexeyxo/protobuf-swift. Gibt es eine Möglichkeit, protobuf-Nachrichten in den Typ zu konvertieren, den sie erweitern?Casting Protobuf Nachrichten zu ihrem erweiterten Typ

proto-Datei:

message Command_Login { 
    extend SessionCommand { 
     optional Command_Login ext = 1001; 
    } 
    optional string user_name = 1; 
    optional string password = 2; 
} 

Hier ist der swift Code:

let commandContainerBuilder = CommandContainer.Builder() 
commandContainerBuilder.sessionCommand.append(commandLogin) 
// sessionCommand is an array of SessionCommand (of which Command_Login extends) 

Fehler:

Cannot convert value of type CommandLogin? to expected argument type SessionCommand

Antwort

1

Leider haben Sie falsch interpretiert Erweiterungen. Ich sage "sorry", weil das wahrscheinlich meine Schuld ist - ich habe die "extensions" -Funktion entworfen, und leider habe ich mit dem Wort "extend" eine Menge Leute verwirrt.

Sie sehen, Erweiterungen haben nichts mit Vererbung zu tun. In Ihrem Beispiel sind Sie nicht, das Command_Login ist jede Art von Unterklasse von SessionCommand. Dies ist leichter zu verstehen, wenn wir die Erklärungen um ein wenig verschieben:

message Command_Login { 
    optional string user_name = 1; 
    optional string password = 2; 
} 

extend SessionCommand { 
    optional Command_Login ext = 1001; 
} 

Die oben ist vollständig gültig und entspricht genau Ihren Code mit einer Ausnahme Unterschied: In Ihrer Version, den Namen der Nebenstelle des ist Command_Login.ext (weil Sie erklärt Es verschachtelte innerhalb Command_Login), aber in meiner Version ist der Name nur ext (im globalen Bereich). Anders als Namespacing funktionieren sie gleich.

Was die extend-Klausel tatsächlich tut, ist ein neues Feld unter SessionContext zu deklarieren, wobei der Typ dieses Feldes Command_Login ist. Wenn Sie eine extend-Klausel innerhalb eines message Blocks platzieren, ist dies nur für Namespacing-Zwecke wichtig, ähnlich wie das Deklarieren statischer Member einer Klasse in C++ oder Java.