Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
568 views
in Technique[技术] by (71.8m points)

swift3 - Array of implicitly unwrapped optionals iterates forever in 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)")
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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!] = []

(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]!

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...