iOSプロジェクトでプロトコルバッファを使いたいです。プロジェクト全体をObjective-C++の失敗にするのを避けようとしているので、Objective-CのクラスにC++のprotobufクラスをラップしたいと思います。私は数十のprotobufメッセージを持っています。一度に1つのクラスを正常に実行している間は、繰り返しコードを最小限に抑えるために継承を使用したいと思っています。私はObjective-Cを初めて使っています.10年後にC++について知っていることを少しも使っていないので、これはほとんどが欲求不満の練習です。以下は、1つのメッセージをどのようにラップしたかの例です。Objective-Cにプロトコルバッファをラップし、引き続き継承を利用する方法はありますか?
コード
.proto:
message MessageA {
optional string value = 1;
}
MessageAWrapper.h:
#import <Foundation/Foundation.h>
@interface MessageAWrapper : NSObject
@property (nonatomic) NSString *value;
+ (id)fromString:(NSString *)string;
- (NSString *)serialize;
@end
MessageAWrapper.mm:
#import "MessageA.h"
#import "message.pb.h"
@interface MessageAWrapper()
@property (nonatomic) MessageA *message;
@end
@implementation MessageAWrapper
- (id)init
{
self = [super init];
if (self) {
self.message = new MessageA();
}
return self;
}
- (void)dealloc {
delete self.message;
self.message = NULL;
}
- (NSString *)value {
return [NSString stringWithUTF8String:self.message->value().c_str()];
}
- (void)setValue:(NSString *)value {
self.message->set_value([value UTF8String]);
}
- (NSString *)serialize {
std::string output;
self.message->SerializeToString(&output);
return [NSString stringWithUTF8String:output.c_str()];
}
+ (id)fromString:(NSString *)string {
MessageA *message = new MessageA();
message->ParseFromString([string UTF8String]);
MessageAWrapper *wrapper = [[MessageAWrapper alloc] init];
wrapper.message = message;
return wrapper;
}
@end
ゴール
だけ変動が包まれたクラス型(init
、
dealloc
、
serialize
、
fromString
)ので、理想的に私はそれを上に置くしたいとした何十回も繰り返され、ここで多くのコードがあり
代わりに親のProtobufMesssage
クラス。残念ながら、親クラスが子供が使用しているクラスを知る方法を見つけることができないので、私はこの作業を成功させることができませんでした。例えば、init
とfromString
が必要です。私は
-
が発生しました
- 構造体
- テンプレートクラス
- void *型
- クラス/タイプ
- .Hファイル内の任意のC++ヘッダまたはコードを持つことができない(これは、Objective-Cのことがプロジェクト全体を必要と++)
- への参照を格納するための方法を見つけることができません彼らは私がC++やObjective-Cのはほとんど理解していると述べたよう
障害物をしようとしました
物事
抽象的であるためいるProtobufメッセージの両親(Message
またはMessageLite
)への参照を維持する難しさ。私の経験のほとんどは、PythonやJava(ポインタのような基本的なC言語のことはほとんど理解していますが)のようなより高水準の言語を使用しています。
が、これはおそらくないでも可能ですか?私はそれに近づいているか、何かが明らかでないか?どんな助けでも大歓迎です。ありがとう。
'dynamic_cast'を使用する方が良いでしょう – newacct