我想提一些关于一件事的提示:
在绑定到tableview列的数组中,我有一些数值(浮点)值。使用标记为“0”,“1”,“2”等界面按钮输入(放入数组)这些值。还有一个“C”按钮可以取消输入。
后来,我对这个数组进行了一些计算。如果没有输入结果,则数组的对象不能为0.“无值”当然更好地用“nil”表示...但是不允许将nil对象插入数组(nil表示“数组末尾”)。 / p>
NSArray包含对象。也就是说,这里,这些对象必须是NSNumbers。所以我可以用[NSNumber numberWithDouble:...]填充它来初始化我的数组?我不能在这里说不好!
真正的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来过滤我的数组? - 我怎么能将单元格变为“无”,因为特殊值是某种东西并出现在单元格中(偶数)
我确信这个问题有一个优雅的解决方案。但是现在我只是撕掉了我留下的小头发......
感谢帮助...
答案 0 :(得分:3)
您可以添加NSNull对象来表示空值。
答案 1 :(得分:2)
NSArray必须始终包含对象,nil是指示数组末尾的标志。因此,为了将nil值表示为对象,您应该使用NSNull,如下所示:
[NSNull null]
答案 2 :(得分: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)