Array of implicitly unwrapped optionals iterates forever in Xcode 8 beta 4
Asked Answered
H

1

1

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)")
}
Holohedral answered 9/8, 2016 at 11:32 Comment(2)
You are adding items to the same array you are iterating over. Your question looks like you have not taken the time to debug it yourself.Chlorobenzene
Thankyou for the feedback codingFriend. The issue that I have is that I want a lazily initiated array. But the problem that I am facing is that when an array has optional items within it .. the for loop Never exits. In the above code array.count =1 ... but the for loop iterates to infinity.Holohedral
U
2

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.

Unspeakable answered 9/8, 2016 at 17:37 Comment(3)
Thankyou Hamish for link the bug database. I had tried searches in Apple's bug tracker, but was unsuccessful (and it takes forever to return!). Thankyou also for the lazy suggestion. Glad that this is known issue. I was beginning to think that Swift3 conversion would required me revisiting all for loop to 'break' when 'nil' items were encountered.Holohedral
@Holohedral Actually, I'm still able to reproduce this in Xcode 8 beta 5.Unspeakable
@ Hamish. Agreed. This problem is still reproducible on Beta5.Holohedral

© 2022 - 2024 — McMap. All rights reserved.