如果Swift中的数组是不可空的呢?想一想:如果Swift已经设计了非空数组会怎样。但那会很烦人,对吧?什么语言有非空数组?但是,Swift的非空数组相比C修改了许多规则。比如switch不需要break,甚至可以用fallthrough来连接几个case。没有++运算符,它是如此混乱、多余,没有它的语言会变得更好。此外,与C不同,Swift需要显式声明可空性。Swift允许您使用Optional类型向类型系统指定一个值是否可以为空。你可以说你有一个控制器,或者可能有也可能没有控制器。类型系统可以到处检查以确保这个值在需要的时候不会为空。DoublyEmptywhenOptionalandArrayintersect,你有两种方式来描述空值:nil或一个空数组。这可能有点令人费解,例如,当您检查数组是否为nil或空数组时。例如,你想更好地在Swift中使用可选链时,optionalArray?.isEmpty返回一个Optional,这是一种天生令人困惑的类型。如果在if语句中使用此描述,编译器将抛出编译错误,因为这是一个Optional布尔值。optionalArray==[]会编译,但当数组为nil时会返回false,这不是我们想要的行为。你可以通过几种方式实现目标,但并不多:!=false{ifoptionalArray?.isEmpty??false{最简单的方法是记住不要使用Optional数组。我一直严格遵守这条规则,保证不会将不同类型的“空值”混合在一起。我对其他“可空”类型也这样做——字典、字符串、布尔值和其他一些。必须检查这两种类型控制检查是我最不想做的事情。服从类中的属性很容易,但不可能在所有情况下都服从。比如从一个Optional的实例中获取一个数组属性就会变成一个Optional数组。letwheels=optionalCar?.wheels//结果是[Wheel]?从字典中获取数组也是如此。letwheels=dictionary["wheels"]as?[Wheel]你必须在每个语句后跟??[].我们刚刚摆脱了无法区分控制器和可空控制器的困境。我们获得了简化语句、减少错误和可声明的能力。现在我们又遇到了这个困境。如果一个数组不能为空,那么Optional数组代表一个空数组,非Optional数组永远至少包含一个值。不可能同时有两种语义空值,任何使用其他语义的代码都将无法编译。对非空数组进行建模对于建模也很有用。有时告诉类型系统给定的数组永远不能为空是很有用的。例如,也许您的用户类有很多邮箱,但如果用户没有电子邮件地址,则不应对其进行验证。如果让类型系统在过去接受这样的描述,那就太好了,但我们现在做不到。其他例子:一个国家必须至少有一个城市。一张专辑必须有至少一首歌曲。建筑物必须至少有一层。这样的例子很多。如果一个数组类型不能为空,那么所有这些关系和约束都可以在类型系统中显示出来,并且你不能删除数组中的最后一个元素。表达式语句随着Optional类型的出现,许多表达式被简化了。当您知道一个类型永远不会为空时,您可以跳过null检查并使用more以直观的方式对其进行操作。非空数组也是如此。现在,收集协议方法,如first、last、max和min返回Optional,只是为了处理数组为空的情况。数组不会为空的情况很多,但每当我使用first等方法时,我还是要为自己辩解,只是为了告诉类型系统它不为空。如果数组不能为空,这些方法可以返回非空值,使用这些语句会更容易。可以通过可选链接调用空数组,并且返回值也是可选的。如果数组不能为空,则附加插入到非空数组中可以正常工作。插入可空数组是一场灾难。varemptiableArray=//。..emptiableArray==nil?emptiableArray=[newItem]:emptiableArray?.append(newItem)这很烦人,但好消息是,在Swift3.1中,我们可以为泛型的特定类型添加扩展。然后,我们可以给Optional的Array类型添加方法(在此之前,只能对使用该协议的类型添加扩展)some(array):array.append(element)case.none:self=[element]}}}现在我们可以像以前一样畅通无阻地操作了。在不失一般性的情况下我们更进一步,如果数组的泛型参数包含数组的长度呢?例如,向Array中插入一个值将返回一个Array