【问题标题】:Array of implicitly unwrapped optionals iterates forever in Xcode 8 beta 4在 Xcode 8 beta 4 中,隐式展开的选项数组永远迭代
【发布时间】:2016-08-09 11:32:01
【问题描述】:

我的代码(下面的片段)导致模拟器挂起。 我做错了什么?

要重现问题,请剪切并粘贴到模拟器中。

class INK
{
    var test = 1
}

var array = [INK!](repeating: nil, count: 1)

for idx in 0..<array.count
{
    array[idx] = INK()
}

var idx2 = 0
for ink_item in array
{
    idx2 += 1
    print("idx2=\(idx2)")
}

【问题讨论】:

  • 您正在将项目添加到您正在迭代的同一数组中。您的问题看起来像您没有花时间自己调试。
  • 感谢反馈编码的朋友。我遇到的问题是我想要一个延迟启动的数组。但我面临的问题是,当数组中有可选项目时.. for 循环永远不会退出。在上面的代码中 array.count =1 ...但是 for 循环迭代到无穷大。

标签: swift3 xcode8-beta4


【解决方案1】:

这是一个已知错误,请参阅SR-1635。由于 IUO 是 no longer a distinct type,所以一开始就不应该拥有它们的数组。

以下代码无法编译的事实证实了这一点:

// compiler error: Implicitly unwrapped optionals are only allowed at top level.
// and as function results
var array: [Ink!] = []

(注意我将你的类名重命名为 Ink 以符合 Swift 命名约定)

根据您的情况,您可能需要考虑改用lazy property

lazy var array : [Ink] = {

    var array = [Ink]()

    // populate array

    return array
}()

或者使数组本身成为一个隐式展开的可选(并推迟数组的分配和初始化):

var array : [Ink]!

尽管请注意,由于其inherent unsafety,IUO 应始终是最后的手段。

【讨论】:

  • 感谢 Hamish 链接错误数据库。我曾尝试在 Apple 的错误跟踪器中进行搜索,但没有成功(而且它需要永远返回!)。也谢谢你的懒惰建议。很高兴这是已知问题。我开始认为 Swift3 转换需要我在遇到“nil”项目时重新访问所有 for 循环以“中断”。
  • @Antony 实际上,我仍然能够在 Xcode 8 beta 5 中重现这一点。
  • @哈米什。同意。这个问题在 Beta5 上仍然可以重现。
猜你喜欢
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
相关资源
最近更新 更多