iOSプロジェクトでプロトコルバッファを使用したい。プロジェクト全体をObjective-C++の大失敗にしないようにしているので、C++のprotobufクラスをObjective-Cのクラスにラップしたいと思います。私は数十のprotobufメッセージを持っており、一度に1つのクラスでこれを正常に実行しましたが、理想的には、継承を使用して繰り返されるコードを最小限に抑えたいと思います。私はObjective-Cを初めて使用し、10年間C ++についてほとんど知らなかったものを使用していなかったため、これは主にフラストレーションの練習でした。以下は、私が1つのメッセージをどのようにラップしたかの例です。
コード
.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
。
私が試したこと
- 構造体
- テンプレートクラス
- 空所*
私が遭遇した障害
- クラス/タイプへの参照を格納する方法が見つかりません
- .hファイルにC++ヘッダーまたはコードを含めることはできません(これには、プロジェクト全体がObjective-C ++である必要があるため)
- 抽象的であるため、protobufメッセージの親(
Message
または)への参照を維持するのが難しいMessageLite
私が言ったように、私はC++またはObjective-Cについてほとんど理解していません。私の経験のほとんどは、PythonやJavaなどの高級言語での経験です(ただし、ポインターなどの基本的なCのことはほとんど理解しています)。
これはおそらく不可能ですか?私はそれに間違ってアプローチしていますか、それとも明らかな何かを見逃していますか?どんな助けでも大歓迎です。ありがとう。