導(dǎo)言
因?yàn)轫?xiàng)目比較老的緣故,(Google)protobuf的OC版本一直用的是一個(gè)古老的實(shí)現(xiàn),也就是使用Builder模式的實(shí)現(xiàn)。
例如:
對(duì)于這樣的一個(gè)proto定義:
message MessageA{
required string msg = 1;
}
message MessageB {
required MessageA amsg = 1;
}
創(chuàng)建最頂層結(jié)構(gòu)的代碼要這樣寫(xiě)
- (void)makePB {
MessageB_Builder *msgbBuilder = [MessageB builder];
MessageA_Builder *msgaBuilder = [MessageA builder];
msgaBuilder.msg = @"the message";
msgbBuilder.amsg = [msgaBuilder build];
MessageB *msgb = [msgbBuilder build];
NSLog(@"%@", msgb.amsg.msg);
}
其builder要從最深層次對(duì)象開(kāi)始創(chuàng)建,逐層向上,思維方式十分的別扭。
于是,想起了GCC的一個(gè)擴(kuò)展語(yǔ)法,貌似挺好用。
- (void)makePBWithGCC {
MessageB_Builder *msgbBuilder = [MessageB builder];
msgbBuilder.amsg = ({
MessageA_Builder *msgaBuilder = [MessageA builder];
msgaBuilder.msg = @"the message";
[msgaBuilder build];
});
MessageB *msgb = [msgbBuilder build];
NSLog(@"%@", msgb.amsg.msg);
}
思維方式依次從上往下,十分舒暢。
用法講解
這個(gè)語(yǔ)法的形式是:({}),它是GNU C的一個(gè)擴(kuò)展語(yǔ)法(GCC和clang都支持它)。它的執(zhí)行結(jié)果是最后一個(gè)語(yǔ)句的值。如果最后一個(gè)語(yǔ)句不能被計(jì)算出值,那么這個(gè)結(jié)果是void類(lèi)型。
具體的語(yǔ)法講解請(qǐng)參考[Statement Expressions - GCC, the GNU Compiler Collection】(https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html)
疑問(wèn)
這個(gè)語(yǔ)法結(jié)構(gòu)內(nèi)的變量的生命周期是否和大括號(hào)({})的等同呢?