【问题标题】:Why doesn't this NSSet member method work?为什么这个 NSSet 成员方法不起作用?
【发布时间】:2012-05-22 01:55:00
【问题描述】:

我有一个NSSet@"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。

【问题讨论】:

    标签: objective-c cocoa nsset


    【解决方案1】:

    字符串@"x" 不是everythingOnStack 的成员。它是program 的任何类型集合的成员(看起来像一个数组)。当您执行[everythingOnStack member:@"x"](顺便说一下,括号是不必要的)时,您会得到nil,因此您最终会得到variablesOnStack 的空集。

    为了从everythingOnStack 中取出@"x",您必须从program 数组中取出它:

    [[everythingOnStack member:program] objectAtIndex:3]
    

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

    【讨论】:

    • 是的,我正在实现一个计算器.. 正在通过 iTunes U 中的斯坦福在线课程。很棒的课程。在课堂上,建议使用括号。通过使用正确的 NSSet 初始化,如下所示,成员方法现在可以正常工作。谢谢你的帮助。如果我有足够的积分,我会投票给你。
    【解决方案2】:

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

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

    【讨论】:

    • 好吧,我希望我有足够的积分来投票给你。你完全正确。 ` NSSet *everythingOnStack = [[NSSet alloc] initWithArray:program]; ' 现在效果很好!
    猜你喜欢
    • 2015-10-05
    • 2015-07-08
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多