Ios 在强类型集合中为Null?

Ios 在强类型集合中为Null?,ios,objective-c,cocoa-touch,build,warnings,Ios,Objective C,Cocoa Touch,Build,Warnings,我有一个强类型集合: NSMutableArray<SupportClass *> *_items; NSMutableArray<SupportClass *> *_items; 但对于键入的一个,我在那一行得到以下警告: 不兼容的指针类型正在向的参数发送“NSNull*\u Nonnull” 类型“SupportClass*\u非空” 我理解为什么在这个示例中,类型化集合和[NSNull null]对象混合出现警告 使用complile时间类型检查的强类型集合,同

我有一个强类型集合:

NSMutableArray<SupportClass *> *_items;
NSMutableArray<SupportClass *> *_items;
但对于键入的一个,我在那一行得到以下警告:

不兼容的指针类型正在向的参数发送“NSNull*\u Nonnull” 类型“SupportClass*\u非空”

我理解为什么在这个示例中,类型化集合和
[NSNull null]
对象混合出现警告

使用complile时间类型检查的强类型集合,同时能够将
null
类对象放入其中,正确的方法是什么

我有一个强类型集合:

NSMutableArray<SupportClass *> *_items;
NSMutableArray<SupportClass *> *_items;
NSMutableArray*\u项;
结合您的两条评论:

但我所知的[大多数]编程语言允许使用编译时类型检查的类型化集合,同时能够将空对象放入其中。所以我只是在寻找一种方法来对ObjC做同样的事情

您面临的问题是,您正在使用Objective-C中最近添加的一个组件,该组件旨在改进与Swift的交互工作,而Swift不允许您以这种方式将空值混合到“强类型集合”中

Swift模型通常用“非空参考和可选”模型替换您使用的“参考或空”模型。在Swift中,对
SomeClassType
的引用是非空的,而类型
SomeClassType?
可选的缩写。
可选
类型有两种情况:
.none
.some(v)
,Swift允许您通过与
nil
比较来测试
.none

斯威夫特并没有发明这个模型,(像语言的大多数部分一样),它是从其他语言继承而来的,就像许多函数式语言一样,它们是这种标记联合的强大用户

我的问题是:从有经验的ObjC开发人员的角度来看,哪一个更适合处理这个问题

使用
NSNull
,就像您尝试的那样。这是苹果公司推荐的方法,
NSNull
存在的理由,但可以追溯到苹果公司推出轻量级泛型以帮助在Obj-C和Swift之间架起桥梁之前

如何在后轻量级泛型世界中使用“引用或空”模型?我想你知道大多数替代方案,包括:

  • 不要。不要在Obj-C中使用强类型集合,或者按照Swift模型使用它们
  • 使用Swift。如果您想要静态强类型而不是运行时类型,请使用基于它的语言
  • 使用子类。重写每个方法/属性以引发非法使用null异常。添加一个
    isNull
    谓词。等等
  • 使用可分辨对象。如果不喜欢继承,那么只需创建一个类的唯一实例来充当null case。添加适当的方法/属性以支持它
  • 在Obj-C中构建您自己的
    可选
  • 打破纸墙。轻量级泛型实际上是标准集合之上的一层薄薄的纸,如果你必须的话
  • 等等
没有单一的“正确方法”来解决您的问题。查看您的设计,确定“空引用”模型是否是关键,选择适合您情况的解决方案


HTH

强类型表示它只包含指定类型的对象。如果要放入其他对象,则它不再是强类型的。您可以将其定义为
NSMutableArray*
,然后警告将消失。这也会更干净。编写
NSMutableArray*
是向您的同事(或后来阅读您的代码的人)承诺只将
SupportClass*
-对象放入此集合。正如我在问题中提到的,我理解为什么会发出警告。但我所知道的所有编程语言都允许使用编译时类型检查的类型化集合,同时能够将空对象放入其中。因此,我只是在寻找一种对ObjC执行相同操作的方法。您需要创建
SupportClass
NullSupportClass
子类。这可能是一个单例(NSNull就是这样),因此您可以将数组元素与NullSupportClass单例进行比较,以检查是否为“null”。但是,数组中的数据结构可能不正确。您可以在SupportClass中创建一些类似谓词的方法,如-(BOOL)isEmpty,如果实例未设置任何属性,它将返回YES。@AlexanderAbakumov:您可能认为您理解,但编译器不同意您的意见。我同意编译器的观点;)您面临的问题是一个经典的XY问题。