我试图在Swift中创建一个稀疏数组。我不确定问题是否在我的声明中(未检测到语法错误)或可能是beta 2中的错误?
我试图将24个类实例的数组声明为可选项。然后,我可以根据需要填充数组的插槽。这是宣言:
var usage = WaterUsage?[](count:24, repeatedValue:nil)
这可以毫无错误地通过Xcode 6 beta 2编译器。目的是最终得到一个24" WaterUsage"所有类都设置为nil。
当我尝试设置数组元素时:
usage[hour] = usage
小时是< 24我收到错误:
" WaterUsage没有名为下标的成员"
我也尝试过使用泛型,但这似乎也不起作用。
我发现在复杂数据结构中使用选项的Swift语法有点模糊,可以在这里使用一些建议。
答案 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>,要求我们在可以访问其属性之前将该成员解包两次
有趣的东西!