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)")
}
Hamish
  • 78,605
  • 19
  • 187
  • 280
Antony
  • 11
  • 2
  • 1
    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. – codingFriend1 Aug 09 '16 at 11:36
  • 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. – Antony Aug 09 '16 at 16:46

1 Answers1

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.

Community
  • 1
  • 1
Hamish
  • 78,605
  • 19
  • 187
  • 280
  • 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. – Antony Aug 09 '16 at 18:15
  • 1
    @Antony Actually, I'm still able to reproduce this in Xcode 8 beta 5. – Hamish Aug 10 '16 at 07:37
  • @ Hamish. Agreed. This problem is still reproducible on Beta5. – Antony Aug 10 '16 at 17:30