在 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