隐式解开的可选数组在Xcode 8 beta 4中永远迭代 [英] Array of implicitly unwrapped optionals iterates forever in Xcode 8 beta 4

查看:106
本文介绍了隐式解开的可选数组在Xcode 8 beta 4中永远迭代的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My code (fragment below) causes the Simulator to Hang. What am I doing wrong?

要重现该问题,请将其剪切并粘贴到模拟器中.

To reproduce the problem, cut and paste into the Simulator.

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)")
}

推荐答案

这是一个已知的错误,请参见不再是唯一类型,实际上应该不可能一开始就包含它们.

This is a known bug, see SR-1635. Since an IUO is no longer a distinct type, it shouldn't really be possible to have an array of them in the first place.

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

This is confirmed by the fact that the following code fails to compile:

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

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

(note I renamed your class name to Ink to conform to Swift naming conventions)

根据您的情况,您可能需要考虑使用

Depending on your situation, you may want to consider using a lazy property instead:

lazy var array : [Ink] = {

    var array = [Ink]()

    // populate array

    return array
}()

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

Or making the array itself an implicitly unwrapped optional (and defer both the allocation and initialisation of the array):

var array : [Ink]!

尽管请注意,由于IUO

Although note that IUOs should always be a last resort due to their inherent unsafety.

这篇关于隐式解开的可选数组在Xcode 8 beta 4中永远迭代的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆