1

我想对一件事有一些提示:

在绑定到 tableview 列的数组中,我有一些数字(浮点)值。使用标有“0”、“1”、“2”等的界面按钮输入(放入数组中)这些值。还有一个“C”按钮可以取消条目。

后来,我对这个数组进行了一些计算。如果没有输入结果,则数组的对象不能为 0。“无值”当然用“nil”表示更好……但不允许将 nil 对象插入数组(nil 表示“数组结束”)。

NSArray 包含对象。也就是说,在这里,这些对象必须是 NSNumbers。所以我可以通过用 [NSNumber numberWithDouble:...] double 填充它来初始化我的数组?我不能在这里放零!

一个真正的 NSArray 不(不能)包含“洞”。但是我必须这样做,例如,如果第三项从未收到过价值。我怎样才能:

为我的 NSNumber 实现“未定义”值?使“C”按钮删除以前输入的结果?

必须有解决办法。在 ApplescriptObjC 中,我使用了一个技巧:我在每个按钮调用的方法中使用其标题进行了归因,因此:

 if sender's title as string is "C" then
 set item theRow of gResult to missing value -- the row was the selected line, gResult was a AS list.
 else
 set item theRow of gResult to sender's title as real
 end if

我应该在这里做什么?- 选择一个特殊值(比如-1)来表示一个未定义的值,然后使用 NSPredicate 过滤我的数组?- 我怎么能把单元格变成“无”,因为特殊值是什么并出现在单元格中(甚至)

我确信这个问题有一个优雅的解决方案。但是现在我只是把我剩下的那一点头发撕掉了……</p>

感谢您的帮助……</p>

4

3 回答 3

3

您可以添加一个 NSNull 对象来表示一个空值。

于 2012-05-12T18:36:53.623 回答
2

NSArray 必须始终包含对象,nil 是指示数组结束的标志。因此,为了将 nil 值表示为对象,您应该使用 NSNull,如下所示:

[NSNull null]
于 2012-05-12T18:55:30.917 回答
0

你需要在你的 NSArray 中有一个“杰出”的对象。当您看到那个杰出的对象时,您的代码会做一些不同的事情。这样一个“杰出”的对象通常被称为“哨兵”,它可以是任何东西。例如:

static NSNumber *theSentinel;

/* initialize theSentinel somewhere with */
theSentinel = [NSNumber numberWithFloat: <anyfloat-doesnt'-matter-which>];

然后在您的代码中:

NSNumber *selection = [NSArray objectAtIndex: <user selection>];

if (selection == theSentinel) { /* something */ }
else { /* main */ }

在您的谓词中,您可以使用(用文字,而不是代码):

predicate = (obj NOT EQUAL theSentinel) AND (rest of your predicate based on float)
于 2012-05-12T18:49:07.060 回答