Objective c 非标准三值表达式

Objective c 非标准三值表达式,objective-c,Objective C,我一直在用objective-c方法阅读,但我读到了一些困扰我头脑的东西 我习惯了三元表达式,我经常使用它们,但我不知道这是不是一个 - (void)updateDocSizeIndicator { NSLog(@"REPRO : WindowController - updateDocSizeIndicator"); int nbPages = [documentView.subviews count]; [documentSizeIndicator setString

我一直在用objective-c方法阅读,但我读到了一些困扰我头脑的东西

我习惯了三元表达式,我经常使用它们,但我不知道这是不是一个

- (void)updateDocSizeIndicator
{
    NSLog(@"REPRO : WindowController - updateDocSizeIndicator");
    int nbPages = [documentView.subviews count];
    [documentSizeIndicator setStringValue:[NSString stringWithFormat:NSLocalizedString(@"/ %d %@", nil), nbPages ? nbPages : 1, nbPages > 1 ? @"pages" : @"page"]];
}
最后一行是我的问题,我不明白在这个三元组中,“.”的用法。谁能给我解释一下吗

[documentSizeIndicator setStringValue:[NSString stringWithFormat:NSLocalizedString(@"/ %d %@", nil), nbPages ? nbPages : 1, nbPages > 1 ? @"pages" : @"page"]]; 

谢谢

这可以分解如下:

[documentSizeIndicator setStringValue:[NSString stringWithFormat:
        NSLocalizedString(@"/ %d %@", nil), 
            nbPages ? nbPages : 1, 
            nbPages > 1 ? @"pages" : @"page"]];
NSLocalizedString(@/%d%@,nil)
的调用将字符串
@/%d%@“
作为绑定查找键传递,且无注释(参数)-请参阅。必须在定义默认值的Localizable.strings文件中定义键本身(请参阅。生成的值必须与使用的键相似,并为十进制和对象提供格式字符串(例如,可能与默认情况下使用的键相同-
@/%d%@

因此,调用上述
NSLocalizedString
的结果类似于
NSString
@/%d%@

行的其余部分只是提供填充该格式的值。正如@cyclone所述,您有两个三元运算符,用于填充该格式: nbPages?nbPages:1
nbPages>1?@“pages”:@“page”

您的问题是,您有一个由许多表达式构建的复杂表达式

[documentSizeIndicator setStringValue:[NSString stringWithFormat:NSLocalizedString(@"/ %d %@", nil), nbPages ? nbPages : 1, nbPages > 1 ? @"pages" : @"page"]];
我们可以简化它。显然有一个方法
-setStringValue:
(顺便说一句:您可以使用点表示法)只取一个参数:

NSString *string = [NSString stringWithFormat:NSLocalizedString(@"/ %d %@", nil), nbPages ? nbPages : 1, nbPages > 1 ? @"pages" : @"page"];
dosumentSizeIndicator.stringValue = stringValue;
让我们关注第一行。有一条消息带有选择器
stringWithFormat:
。您有一个相应的方法
-stringWithFormat:…
,该方法有一个打开的参数列表:您可以传递任意多个参数。每个参数用逗号分隔:

NSLocalizedString(@"/ %d %@", nil), nbPages ? nbPages : 1, nbPages > 1 ? @"pages" : @"page"
--argument1-----------------------, --argument2----------, --argument3---------------------
对于每个参数,您都有一个表达式(嗯,您必须):


因此,逗号不是表达式的一部分,而是将它们分开。

有两个不同的三元表达式,分别对应于
NSLocalizedString()
的最后两个参数。第一个计算为整数,第二个计算为字符串。您怎么会认为这是“非标准”的?函数参数的条件运算符和逗号分隔符都是标准C,这里也介绍了它们的用法。我称之为非标准运算符,因为我不习惯于此。我通常将它们用作var=(条件)?true:false;
argument1 = NSLocalizedString(@"/ %d %@", nil) // a function call
argument2 = nbPages ? nbPages : 1              // a conditional expression
argument3 = nbPages > 1 ? @"pages" : @"page"   // a conditional expression