You could make either option 1 or 2 conform to SequenceType and provide them in the library for common types like small vectors and small matrices. That would probably cover a lot of use cases. <div><br></div><div>In the longer term there is a thread on Swift evolution for computable types which would address this issue. <span></span><br><br>On Thursday, 28 January 2016, Justin Kolb via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">To better support interfacing with lower level systems, like graphics libraries for example, it would be helpful to support the concept of contiguous variables. The most common use case for this would be to create a Matrix struct that can be passed as data into something like Metal. This can be accomplished now, using something like the following:<div><br></div><div>Current Option 1:</div><div><br></div><div>struct Matrix2x2 {</div><div>    var m00: Float</div><div>    var m01: Float</div><div>    var m10: Float</div><div>    var m11: Float</div><div>}</div><div><br></div><div>OR</div><div>Current Option 2:<br></div><div><br></div><div>struct Matrix2x2 {</div><div>    var m: (Float, Float, Float, Float)</div><div>}</div><div><br></div><div>OR</div><div>Current Option 3:</div><div><br></div><div>struct Matrix2x2 {</div><div>    var m: [Float]</div><div>}</div><div><br></div><div>Options 1 &amp; 2 allow for the compiler to enforce the fixed number of elements and also for the data to be easily passed into graphics libraries as their memory layout is somewhat predictable using sizeof, strideof, and alignof. The downside is that you lose the ability to easily subscript or iterate the elements.</div><div><br></div><div>Option 3 does allow subscripting and iteration, but does not at compile time enforce a fixed number of elements and is not as easily passed into a library that expects to receive the raw data of the matrix.</div><div><br></div><div><br></div><div>Contiguous Variables:</div><div><br></div><div>struct Matrix2x2 {</div><div>    var m: Float:2*2</div><div>}</div><div><br></div><div>The variable `m` represents a series of 4 contiguous Float values. The specific number of values must be a compile time constant. The only needed functionality includes `count`, `subscript`, and iteration. To make things easier to implement and to help avoid confusion and more complex documentation, multiple dimensions are not allowed. To define multiple dimensions you must provide your own ordering by wrapping this type in another type and providing a custom subscript implementation. For example:</div><div><br></div><div>struct RowMajorMatrix2x2 {</div><div>    var m: Float:2*2</div><div><br></div><div>    static let rows = 2</div><div>    static let columns = 2</div><div><br></div><div>    subscript(row: Int, column: Int) -&gt; Float {</div><div>        return m[column * Matrix2x2.rows + row]</div><div>    }</div><div>}</div><div><br></div><div>sizeof(Matrix2x2) is 16</div><div>strideof(Matrix2x2) is 16</div><div><br></div><div>m.count is essentially a compile time constant and is not stored with the rest of the data but is available and can also be used to do runtime bounds checking.</div><div><br></div><div>struct Vector3 {</div><div>    var v: Float:3</div><div>}</div><div><br></div><div>sizeof(Vector3) is 12</div><div>strideof(Vector3) is 12</div><div><br></div><div>C code should also now be able to expose data types that contain fixed sized arrays within them.</div><div><br></div></div>
</blockquote></div><br><br>-- <br>  -- Howard.<br><br>