Objective c 目标C,不允许在NSArray中将NSString与计算和数字混合?
我有两个数组winDscr和winSize。winDscr保存描述,winSize应该保存请求的窗口边界的值。见下文 winDscr目前还可以。但是,winSize在2处显示错误(预期表达式)。包含“{2560,4*2560/5}”的行。我以前从来没有这样做过,难道不允许混合使用字符串和计算吗?我做错了什么 任何线索都会很有帮助的,蒂亚,罗纳德Objective c 目标C,不允许在NSArray中将NSString与计算和数字混合?,objective-c,nsarray,Objective C,Nsarray,我有两个数组winDscr和winSize。winDscr保存描述,winSize应该保存请求的窗口边界的值。见下文 winDscr目前还可以。但是,winSize在2处显示错误(预期表达式)。包含“{2560,4*2560/5}”的行。我以前从来没有这样做过,难道不允许混合使用字符串和计算吗?我做错了什么 任何线索都会很有帮助的,蒂亚,罗纳德 NSArray *winDscr = [NSArray arrayWithObjects: @"Auto",
NSArray *winDscr = [NSArray arrayWithObjects:
@"Auto",
@"2560-> 5:4",
@"2560->16:10",
@"2048-> 4:3",
@"1920-> 4:3",
@"1920->16:10",
@"A2 Portrait",
@"A2 Landscape",
@"A3 Portrait",
@"A3 Landscape",
nil];
NSArray *winSize = [NSArray arrayWithObjects:
@"Auto",
{2560,4*2560/5},
{2560,10*1920/16},
{2048,3*2048/4},
{1920,3*1920/4},
{1920,10*1920/16},
{[convertMMToPixel:420],[convertMMToPixel:594]},
{[convertMMToPixel:594],[convertMMToPixel:420]},
{[convertMMToPixel:297],[convertMMToPixel:420]},
{[convertMMToPixel:420],[convertMMToPixel:297]},
nil];
你有两个问题
首先,{2560,4*2560/5}
本身不是有效的表达式。您可以通过编写(NSSize){2560,4*2560/5}
,将其设置为文本NSSize
表达式。您还可以编写使用库函数的NSMakeSize(2560,4*2560/5)
其次,NSArray
只能保存Objective-C对象,而NSSize
不是Objective-C对象。您可以将NSSize
包装在NSValue
中,并将包装存储在数组中:
NSArray *winSize = [NSArray arrayWithObjects:
@"Auto",
[NSValue valueWithSize:(NSSize){2560,4*2560/5}],
[NSValue valueWithSize:(NSSize){2560,10*1920/16}],
...
要提取尺寸,请执行以下操作:
NSValue *wrapper = winSize[2];
NSSize size = [wrapper sizeValue];
{2560,4*2560/5}
是一个包含两个成员的C结构,而不是objective-C对象。NSArray只能容纳对象。在尝试将这些值添加到数组之前,需要将它们保存在一个NSValue中,NSValue中包含一个CGSize(valueWithCGSize:
)
例如:
...arrayWithObjects:
@"Auto",
[NSValue valueWithCGSize:CGSizeMake(2560,4*2560/5)],
...
这就是我的想法,我的错:)那么花括号呢,在这种情况下允许吗?我在以“First”开头的段落中讨论了花括号。是的,当然,但是valueWithCGSize不被接受,所以我将其改为valueWithSize,这很好。谢谢。我把“[convertMMToPixel:297]”改为“[self-convertMMToPixel:297]”。谢谢,还有一点。我尝试了以下几种方法从winSize数组中检索值:NSInteger theIdx=[sender indexOfSelectedItem];NSValue*theValues=winSizeDimensions[theIdx];它不会抛出错误。但是我如何得到这些值呢?当我记录我的winSize时,我会得到类似这样的文本:“NSSize:{25601440}”、“NSSize:{25602048}”、“NSSize:{25601200}”、“NSSize:{20481536}”,但我如何获得值???就像一个符咒一样工作。)感谢所有人的大力帮助。啊,我理解,但是valueWithCGSize不被接受,所以我将其更改为valueWithSize,这仍然正确吗?我可以为此使用C结构而不是NSArray吗?哦,你在OS X上吗?我猜是iOS。在这种情况下,是的,它也应该是NSSizeMake。@jrturton因为
NSSize
是64位CGSize
的类型定义,根据项目的不同,两者都可以工作。数组是最好的结构;另一种选择是使用名称作为键、大小作为值的字典,但这取决于您以后对数据所做的操作。