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:
将始终返回false。因此,您永远无法在集合中找到[nil isEqual:anything]
。您可以通过额外检查nil
来克服这一问题,但a)违反了使用nil
确定平等性的设计合同,b)增加了实施成本-isEqual:
- 当集合中没有对象时,像
、-lastObject
和-firstObject
这样的方法返回-anyObject
。您如何区分这与返回的nil
是集合的成员?类似地,对于nil
-[nsemulator nextObject]
nil
是每种引用类型的值。isEqual
案例是支持此选择的一个很好的理由。对于其他情况,可以使用不同的sentinel值。-isEqual:
和nsemulator
点特别有启发性。谢谢。Java集合框架中的集合允许null
,并且可以解决上述每个问题。1) 在Java中,也无法从Map.get()
的结果判断值是否为null
或键是否不存在。这就是为什么有一个方法containsKey()
NSDictionary
可以有类似的方法。事实上,CFDictionary
我相信允许NULL
,并且确实有一个CFDictionaryContainsKey
函数来检查密钥。2) 合同可以更改为handlenil
。Java的集合。包含契约检查e
,这样(o==null?e==null:o.equals(e))
(续)3)Java的迭代器
有一个hasNext()
方法来检查是否存在另一个元素,并在没有异常时调用next
<代码>N分子
可以更改为添加一个方法来检查是否有更多的分子,和/或在没有更多分子时在获取下一个分子时引发异常。@newacct,祝贺您演示了我第一段的要点!