我试图在Swift中创建一个稀疏数组。我不确定问题是在我的声明中(没有检测到语法错误)还是测试版2中可能有错误?
我试图将一个由24个类实例组成的数组声明为选项。然后,我可以在必要时填充数组的插槽。以下是宣言:
var usage = WaterUsage?[](count:24, repeatedValue:nil)这通过Xcode 6 beta 2编译器没有错误。其目的是最终得到一个由24个"WaterUsage“类组成的数组,所有这些类都设置为零。
当我试图设置数组元素时:
usage[hour] = usage当小时小于24小时时,我得到了错误:
"WaterUsage没有一个名为下标的成员“
我也尝试过使用泛型,但这似乎也不起作用。
我发现在复杂数据结构中使用选项的Swift语法有点模糊,这里可能需要一些建议。
发布于 2014-07-03 15:32:26
定义数组的方法是为您提供一个可选的可选值数组( 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发布于 2014-07-03 16:25:01
你离我很近!当对数组使用MemberType[]语法糖时,您编写它的方式(WaterUsage?[])实际上将数组声明为可选的,以及它所保存的值。在这种情况下,要将值赋值给索引,首先需要使用以下方法展开Array:
usage![hour] = someWaterUsage
但是,如果您只希望数组中的可选成员(并且不希望Array本身是可选的),那么您可以返回到标准Array声明:
var usage = Array<WaterUsage?>(count:24, repeatedValue:nil)
编辑:
我最初还提供了另一种解决方案的替代语法:
var usage = (WaterUsage?)[](count:24, repeatedValue:nil)
在这样做时,根据@Nate的观察结果,您需要使用两次展开来访问特定索引上的值,例如:
usage[0]!!.someProperty
这只是一次黑暗中的尝试,但我认为在这种情况下可能发生的事情与OP最初使用WaterUsage?[]声明数组时所做的没有什么不同
也就是说,在使用(WaterUsage?)[]__时,它可能将此声明看作是一个Array of 可选元组 holding 可选WaterUsages__,要求我们在访问其属性之前在索引处展开该成员两次。
有趣的东西!
https://stackoverflow.com/questions/24557601
复制相似问题