我正在学习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
答案 0 :(得分:1)
抱歉,您错误解释了扩展程序。我说“对不起”,因为这可能是我的错 - 我设计了“扩展”功能,不幸的是,使用“扩展”这个词让很多人感到困惑。
你看,扩展与继承无关。在您的示例中,您不声明Command_Login
是SessionCommand
的任何类型的子类。如果我们将声明转移一点,这将更容易理解:
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中声明类的静态成员一样。