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

Casting Protobuf Messages to their Extended type

我正在学习 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

抱歉,您误解了扩展名。我说 "sorry" 是因为这可能是我的错——我设计了 "extensions" 功能,但不幸的是,使用 "extend" 这个词让很多人感到困惑。

你看,扩展与继承无关。在您的示例中,您 不是 声明 Command_LoginSessionCommand 的任何类型的子 class。如果我们稍微移动一下声明,这会更容易理解:

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 中声明 class 的静态成员。