2

我在集合中有一个NSSetwith @"x",我正在尝试使用实例方法member:来检查它,如下所示:

NSSet *everythingOnStack = [[NSSet alloc] initWithObjects:program, nil];
NSSet *variablesOnStack =  [[NSSet alloc] initWithObjects:([everythingOnStack member:@"x"]),nil];   

NSLog(@"Variables on, %@",variablesOnStack);
NSLog(@"Everything on stack,%@",everythingOnStack);

member:方法似乎没有看到@"x",我不确定为什么。下面是NSLog()输出。我阅读了文档,它似乎应该可以工作。使困惑。

2012-05-21 20:43:07.902 Calculator[21589:f803] Variables on, {(
)}
2012-05-21 20:43:07.904 Calculator[21589:f803] Everything on stack,{(
    (
    1,
    2,
    x,
    "+"
)
)}

我正在通过斯坦福在线课程学习目标 C。

4

2 回答 2

3

该字符串@"x" 不是的成员everythingOnStack。它是任何类型的集合的成员program(看起来像一个数组)。当你这样做时[everythingOnStack member:@"x"](顺便说一下,括号是不必要的),你会nil回来,所以你最终得到一个空集 for variablesOnStack

为了@"x"摆脱everythingOnStack,您必须将其从program数组中取出:

[[everythingOnStack member:program] objectAtIndex:3]

请注意,这需要您知道您想要的对象在数组中的位置。我不确定这会如何影响您的设计——看起来您可能正在实施 RPN 计算器?

于 2012-05-22T02:19:54.477 回答
1

在我看来,您可能误解了这一行的作用: [[NSSet alloc] initWithObjects:program, nil]; 这会将一个对象,数组“程序”添加到您的集合中,它不会将“程序”中的每个对象添加到您的集合中。如果要将数组的每个成员添加到集合中,可以使用 NSSet *everythingOnStack = [NSSet setWithArray:program];

如果这样做了,那么“x”将成为您的集合的成员。但是,你会得到一个唯一的集合(我认为所有集合都是),所以如果你在“程序”中有两次相同的数字,它只会在集合中出现一次。

于 2012-05-22T05:29:12.233 回答