【问题标题】:Handling sparse arrays in swift快速处理稀疏数组
【发布时间】:2014-07-03 15:20:17
【问题描述】:

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

我正在尝试将一个包含 24 个类实例的数组声明为可选项。然后我可以根据需要填写数组的插槽。这是声明:

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

这可以顺利通过 Xcode 6 beta 2 编译器。目的是最终得到一个包含 24 个“WaterUsage”类的数组,全部设置为 nil。

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

usage[hour] = usage

其中小时是

“WaterUsage 没有名为 subscript 的成员”

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

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

【问题讨论】:

  • 您的代码实际上并没有读取usage[hour] = usage,是吗?如果是这样,我可以看到这是一个问题

标签: arrays swift


【解决方案1】:

定义数组的方式是给你一个可选值的可选数组(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

【讨论】:

  • 两者都试过了,得到了同样的错误。还尝试在下标之前展开使用,也得到了同样的错误
  • import Foundation class DayUsage { var usage = WaterUsage?[](count:24, repeatValue:nil) func addInterval(hour:Int, usage:WaterUsage?) { if (hour &gt;= 0 &amp;&amp; 小时
  • 我认为参数usage 覆盖了实例变量usage。重命名参数?
  • 更改参数名称(我应该更清楚......)和在 WaterUsage 周围使用括号的组合?声明似乎解决了它
  • 太棒了!我希望 Swift 需要 self 才能访问属性。不会让你惹上麻烦的。
【解决方案2】:

你已经很接近了!当为数组使用MemberType[] 语法糖时,您编写它的方式(WaterUsage?[])实际上将数组声明为可选,以及它所包含的值。在这种情况下,要将值分配给索引,您需要先使用以下方法解开数组:

usage![hour] = someWaterUsage

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

var usage = Array&lt;WaterUsage?&gt;(count:24, repeatedValue:nil)

编辑:

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

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

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

usage[0]!!.someProperty

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

也就是说,当使用 (WaterUsage?)[] 时,它可能将此声明视为 Optional TuplesArray,其中包含 Optional WaterUsages,然后要求我们在索引处解开成员两次,然后才能访问其属性

有趣的东西!

【讨论】:

  • 在声明 Optionals 数组时肯定存在一些 Swift 错误。第一个声明的结果类型是WaterUsage??[],这意味着您必须解开数组成员两次才能访问它们:usage[0]!!.someProperty
  • 老兄!这太疯狂了:)
  • 哦,奇怪,我现在看到了,用一个物体试了一下——奇怪!
  • 在这里尝试了一切(泛型、括号、展开),但仍然出现下标错误
猜你喜欢
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 2015-04-07
  • 2017-12-05
  • 2021-04-05
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多