Swift Array with Struct Members (Compiler Bug?)
Swift Array with Struct Members (Compiler Bug?)
- Subject: Swift Array with Struct Members (Compiler Bug?)
- From: Daniel Blakemore <email@hidden>
- Date: Thu, 11 Dec 2014 16:24:53 -0700
I was trying to make a simple 2D array of this struct:
struct Color {
var r : Float = 0
var g : Float = 0
var b : Float = 0
}
As I was reading up on arrays in Swift, I came across this example
initialization:
var threeDoubles = [Double](count: 3, repeatedValue: 0.0)
And there was some mention of immutable arrays being an existing compiler
optimization, so I figured I'd set up my array of arrays all at once so it
could be fast.
After some messing around and guesswork because the Swift autocomplete is
ridiculously slow (I really tried not to complain about Swift for this
entire email, but it's hard), I found that you can nest these calls like so:
var arr1 = [Array](count:6, repeatedValue:[Int](count:8,
repeatedValue:Int()))
This gives you an 8x8 array of arrays of 0s. Pretty simple and neat and
easy to understand (if a little hard to parse visually).
If I do this, however, it breaks:
var arr2 = [Array](count:6, repeatedValue:[Color](count:8, repeatedValue:
Color()))
Well, to be more accurate, it makes a magical array which contains arrays
of 8 colors at indices 0 and 3, and cthulhu at indices 1, 2, 4, and 5. If
you access these during the execution of your program, you get:
EXC_BAD_ACCESS (code=EXC_I386_GPFLT).
If you run all these lines of code in a Swift playground (I named mine
Devil's.playground), it won't even generate an inspectable value for this,
instead it shows the same error (no doubt because it was trying to look at
the cthulhu rows).
LLDB has a little bit easier time and prints this:
(lldb) po arr
6 values
{
[0] = 8 values {
[0] = (r = 0, g = 0, b = 0)
[1] = (r = 0, g = 0, b = 0)
[2] = (r = 0, g = 0, b = 0)
[3] = (r = 0, g = 0, b = 0)
[4] = (r = 0, g = 0, b = 0)
[5] = (r = 0, g = 0, b = 0)
[6] = (r = 0, g = 0, b = 0)
[7] = (r = 0, g = 0, b = 0)
}
[1] = {}
[2] = {}
[3] = 8 values {
[0] = (r = 0, g = 0, b = 0)
[1] = (r = 0, g = 0, b = 0)
[2] = (r = 0, g = 0, b = 0)
[3] = (r = 0, g = 0, b = 0)
[4] = (r = 0, g = 0, b = 0)
[5] = (r = 0, g = 0, b = 0)
[6] = (r = 0, g = 0, b = 0)
[7] = (r = 0, g = 0, b = 0)
}
[4] = {}
[5] = {}
}
It just punts on the rows that cause the problem.
What is the mystery of this 15 line playground:
// Playground - noun: a place where people can play
import Cocoa
var str = "Hello, playground"
struct Color {
var r : Float = 0
var g : Float = 0
var b : Float = 0
}
var arr1 = [Array](count:6, repeatedValue:[Int](count:8,
repeatedValue:Int()))
var arr2 = [Array](count:6, repeatedValue:[Color](count:8,
repeatedValue:Color()))
Any insight would be appreciated.
--
Daniel Blakemore
Pixio Software
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden