Objective-C中protobuf编译文件的问题

时间:2012-02-16 10:57:54

标签: objective-c ios protocol-buffers

我正在为Objective-C使用Protocol Buffers。我编译原型文件没有问题。但是当我将file.pb.h和file.pb.m添加到我的项目时,他们有一些setter返回值,这些值不在Objective-C中存在(至少Xcode为此提供了错误)。任何一个有同样问题或有一些消化的人?

@interface FileResultObject_Builder : PBGeneratedMessage_Builder {
@private
  FileResultObject* result;
}

- (FileResultObject*) defaultInstance;

- (FileResultObject_Builder*) clear;
- (FileResultObject_Builder*) clone;

- (FileResultObject*) build;
- (FileResultObject*) buildPartial;

- (FileResultObject_Builder*) mergeFrom:(FileResultObject*) other;
- (FileResultObject_Builder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (FileResultObject_Builder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasCheckedIn;
- (BOOL) checkedIn;
- (FileResultObject_Builder*) setCheckedIn:(BOOL) value;
- (FileResultObject_Builder*) clearCheckedIn;

- (BOOL) hasCheckedOut;
- (BOOL) checkedOut;
- (FileResultObject_Builder*) setCheckedOut:(BOOL) value;
- (FileResultObject_Builder*) clearCheckedOut;

- (BOOL) hasDescription;
- (NSString*) description;
- (FileResultObject_Builder*) setDescription:(NSString*) value;
- (FileResultObject_Builder*) clearDescription;

- (BOOL) hasLastModifiedDate;
- (NSString*) lastModifiedDate;
- (FileResultObject_Builder*) setLastModifiedDate:(NSString*) value;
- (FileResultObject_Builder*) clearLastModifiedDate;

- (BOOL) hasCreatedDate;
- (NSString*) createdDate;
- (FileResultObject_Builder*) setCreatedDate:(NSString*) value;
- (FileResultObject_Builder*) clearCreatedDate;

- (BOOL) hasSize;
- (int32_t) size;
- (FileResultObject_Builder*) setSize:(int32_t) value;
- (FileResultObject_Builder*) clearSize;

- (NSArray*) keywordsList;
- (NSString*) keywordsAtIndex:(int32_t) index;
- (FileResultObject_Builder*) replaceKeywordsAtIndex:(int32_t) index with:(NSString*) value;
- (FileResultObject_Builder*) addKeywords:(NSString*) value;
- (FileResultObject_Builder*) addAllKeywords:(NSArray*) values;
- (FileResultObject_Builder*) clearKeywordsList;

- (BOOL) hasDirectory;
- (BOOL) directory;
- (FileResultObject_Builder*) setDirectory:(BOOL) value;
- (FileResultObject_Builder*) clearDirectory;

- (BOOL) hasMimeType;
- (NSString*) mimeType;
- (FileResultObject_Builder*) setMimeType:(NSString*) value;
- (FileResultObject_Builder*) clearMimeType;

- (BOOL) hasResult;
- (ResultObject*) result;
- (FileResultObject_Builder*) setResult:(ResultObject*) value;
- (FileResultObject_Builder*) setResultBuilder:(ResultObject_Builder*) builderForValue;
- (FileResultObject_Builder*) mergeResult:(ResultObject*) value;
- (FileResultObject_Builder*) clearResult;
@end

这是代码的一部分。错误是在设置者返回的东西。

1 个答案:

答案 0 :(得分:1)

今天刚遇到同样的问题。 遗憾的是,生成的Objective-C * _builder类使用名为“result”的内部属性来构建实际消息。 如果你的协议缓冲区消息定义也定义了一个名为'result'的属性,那么该消息的构建器类将生成一个setResult:方法,它与内部的'result'声明不同。

从我的角度来看,理想的解决方案是修补Objective-C协议缓冲区编译器插件,以便生成的* _Builder类使用不常见的名称。

您还可以更改邮件定义中的字段名称。这不是理想的,但至少它不会真正破坏任何东西,因为它是使字段唯一的字段标记,而不是它的名称。但是,根据您的情况,这可能并非总是可能。

另一种选择是为违规类补丁生成的代码。同样,远非理想,但作为一个快速修复,但每当你重新生成类时将继续破坏。

这是一个快速修复: https://gist.github.com/pdcgomes/7005463

希望这会有所帮助。 欢呼声。