将 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_Login
是 SessionCommand
的任何类型的子 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 的静态成员。
我正在学习 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_Login
是 SessionCommand
的任何类型的子 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 的静态成员。