将Protobuf消息转换为其扩展类型

时间:2016-07-31 20:01:56

标签: swift protocol-buffers

我正在学习protobuf并正在玩alexeyxo/protobuf-swift有没有办法将protobuf消息转换为它们扩展的类型?

原型文件:

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

以下是swift代码:

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

错误:

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

1 个答案:

答案 0 :(得分:1)

抱歉,您错误解释了扩展程序。我说“对不起”,因为这可能是我的错 - 我设计了“扩展”功能,不幸的是,使用“扩展”这个词让很多人感到困惑。

你看,扩展与继承无关。在您的示例中,您声明Command_LoginSessionCommand的任何类型的子类。如果我们将声明转移一点,这将更容易理解:

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

extend SessionCommand {
    optional Command_Login ext = 1001;
}

以上内容完全有效且完全等同于您的代码,但有一点不同:在您的版本中,扩展名的名称为Command_Login.ext(因为您声明它嵌套在Command_Login内),但在我的版本中名称只是ext(在全局范围内)。除了命名空间,它们的功能相同。

extend子句实际执行的操作是在SessionContext上声明一个新字段,其中该字段的类型为Command_Login。如果碰巧在extend块中放置了message子句,这只对命名空间有用,就像在C ++或Java中声明类的静态成员一样。