Ios 基金会的收集和设计是否有深刻的设计原因?无法存储零? 大家都知道,如 NSArray >代码>、 NS字典>代码>和 NSSET 不能存储 NIL< /Cord>对象,而必须使用 NSNull 。我敢肯定,如果我挖掘开源核心基础源代码,我甚至可以找到在哪里执行。< /P>

Ios 基金会的收集和设计是否有深刻的设计原因?无法存储零? 大家都知道,如 NSArray >代码>、 NS字典>代码>和 NSSET 不能存储 NIL< /Cord>对象,而必须使用 NSNull 。我敢肯定,如果我挖掘开源核心基础源代码,我甚至可以找到在哪里执行。< /P>,ios,objective-c,macos,null,foundation,Ios,Objective C,Macos,Null,Foundation,我不明白的是,为什么它们是这样设计的?这纯粹是因为nil在一些构造函数中被用作哨兵,还是这种行为有更深层次的原因?我认为您不会得到满意的答案。这只是一个设计决定,就像其他一千个决定可可的决定一样。即使当初做出决定的人出现并解释,解释也必然归结为“对我们来说这是最好的”。也就是说,很明显,设计和实现可以容纳nil的集合类是可能的,任何不支持该类的理由都是有争议的。有人会反对这样的理由对他们来说毫无意义,而不是以另一种方式这样做的理由。在这一点上,这只是主观判断 也就是说,这里有几个问题: 假设[

我不明白的是,为什么它们是这样设计的?这纯粹是因为
nil
在一些构造函数中被用作哨兵,还是这种行为有更深层次的原因?

我认为您不会得到满意的答案。这只是一个设计决定,就像其他一千个决定可可的决定一样。即使当初做出决定的人出现并解释,解释也必然归结为“对我们来说这是最好的”。也就是说,很明显,设计和实现可以容纳
nil
的集合类是可能的,任何不支持该类的理由都是有争议的。有人会反对这样的理由对他们来说毫无意义,而不是以另一种方式这样做的理由。在这一点上,这只是主观判断

也就是说,这里有几个问题:

  • 假设
    [dict objectForKey:@“myKey”]
    返回
    nil
    。这是因为
    nil
    已添加为
    @“myKey”
    的值,或者因为未添加任何值 那把钥匙
  • 字典和集合(甚至是
    NSArray
    方法,如
    -containsObject:
    -indexOfObject:
    )使用
    -isEqual:
    测试对象相等性。但是,
    [nil isEqual:anything]
    将始终返回false。因此,您永远无法在集合中找到
    nil
    。您可以通过额外检查
    nil
    来克服这一问题,但a)违反了使用
    -isEqual:
    确定平等性的设计合同,b)增加了实施成本
  • 当集合中没有对象时,像
    -lastObject
    -firstObject
    -anyObject
    这样的方法返回
    nil
    。您如何区分这与返回的
    nil
    是集合的成员?类似地,对于
    -[nsemulator nextObject]

Nil不是一个对象。集合只能存储引用类型,您可以使用NSValue包装类来存储引用类型(即,存储CGRECT等)。或者您可以在您的案例中使用NSNull。@JayMorgan:Right,
nil
是每种引用类型的值。
isEqual
案例是支持此选择的一个很好的理由。对于其他情况,可以使用不同的sentinel值。
-isEqual:
nsemulator
点特别有启发性。谢谢。Java集合框架中的集合允许
null
,并且可以解决上述每个问题。1) 在Java中,也无法从
Map.get()
的结果判断值是否为
null
或键是否不存在。这就是为什么有一个方法
containsKey()
NSDictionary
可以有类似的方法。事实上,
CFDictionary
我相信允许
NULL
,并且确实有一个
CFDictionaryContainsKey
函数来检查密钥。2) 合同可以更改为handle
nil
。Java的
集合。包含
契约检查
e
,这样
(o==null?e==null:o.equals(e))
(续)3)Java的
迭代器
有一个
hasNext()
方法来检查是否存在另一个元素,并在没有异常时调用
next
<代码>N分子
可以更改为添加一个方法来检查是否有更多的分子,和/或在没有更多分子时在获取下一个分子时引发异常。@newacct,祝贺您演示了我第一段的要点!