在swift中处理稀疏数组

时间:2014-07-03 15:20:18

标签: arrays swift

我试图在Swift中创建一个稀疏数组。我不确定问题是否在我的声明中(未检测到语法错误)或可能是beta 2中的错误?

我试图将24个类实例的数组声明为可选项。然后,我可以根据需要填充数组的插槽。这是宣言:

var usage = WaterUsage?[](count:24, repeatedValue:nil)

这可以毫无错误地通过Xcode 6 beta 2编译器。目的是最终得到一个24" WaterUsage"所有类都设置为nil。

当我尝试设置数组元素时:

usage[hour] = usage

小时是< 24我收到错误:

  

" WaterUsage没有名为下标的成员"

我也尝试过使用泛型,但这似乎也不起作用。

我发现在复杂数据结构中使用选项的Swift语法有点模糊,可以在这里使用一些建议。

2 个答案:

答案 0 :(得分:4)

这种定义数组的方法是给你一个Optional数组的可选值(WaterUsage?[]?),你必须先解开它才能使用。我想你只想要值是可选的:WaterUsage?[]。我能够做到这一点的一种方法是使用通用的Array语法:

var usage: WaterUsage?[] = Array<WaterUsage?>(count:24, repeatedValue:nil)
usage[hour] = something

另一种方法是强制展开初始声明的返回值。我不知道为什么,但WaterUsage?[]()有一个可选的返回值。

var usage = (WaterUsage?[](count:24, repeatedValue:nil))!
usage[hour] = something

答案 1 :(得分:0)

你非常接近!对数组使用MemberType[]语法糖时,编写它的方式(WaterUsage?[])实际上将Array声明为Optional,以及它保存的值。在这种情况下,要为索引分配值,您需要首先使用以下命令解包数组:

usage![hour] = someWaterUsage

但是,如果您只想要Array中的Optional成员(并且不希望Array本身是可选的),那么您可以回退到标准Array声明:

var usage = Array<WaterUsage?>(count:24, repeatedValue:nil)

修改

我最初提供了另一种语法作为另一种解决方案:

var usage = (WaterUsage?)[](count:24, repeatedValue:nil)

...但是在这样做时,根据@ Nate的观察结果,您需要使用两次展开来访问特定索引处的值,例如:

usage[0]!!.someProperty

这只是黑暗中的一个镜头,但我认为在这种情况下可能发生的事情与OP最初尝试使用WaterUsage?[] <声明数组的情况完全不同/ p>

也就是说,在使用(WaterUsage?)[]时,可能会将此声明视为可选元组的数组 ,其中包含可选的WaterUsages < / strong>,要求我们在可以访问其属性之前将该成员解包两次

有趣的东西!