在 Xcode 8 beta 4 中,隐式展开的选项数组永远迭代

Posted

技术标签:

【中文标题】在 Xcode 8 beta 4 中,隐式展开的选项数组永远迭代【英文标题】:Array of implicitly unwrapped optionals iterates forever in 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 循环迭代到无穷大。 【参考方案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 上仍然可以重现。

以上是关于在 Xcode 8 beta 4 中,隐式展开的选项数组永远迭代的主要内容,如果未能解决你的问题,请参考以下文章

避免隐式展开变量

在 Xcode7 - beta 5 和 storyboard 中展开 segue

XCode 7 (Beta 3 & 4) 无法下载和安装 iOS 8.* 模拟器

iOS/Xcode:Koloda 框架:在隐式展开 Optional 值时意外发现 nil

Xcode 8 beta 4:Calendar.Unit 与 Calendar.Component

Swift Xcode 致命错误:在隐式展开可选值时意外发现 nil [重复]