2017-02-26 2 views
0

Ich möchte in der Lage sein, Variablen, die Arrays einer bestimmten Größe sind und vor-zugewiesen. In C könnte dies wie folgt gemacht werden:Swift Emulation von C-Array mit einer bestimmten Größe

typedef float vec16f[16]; 
vec4f myPresizedPreInitializedArray; 
myPresizedPreInitializedArray[2]=200.0f 

Wie würde man dies in Swift tun?

I habe versucht, die folgenden:

  • typealias PositionVector = [Double] hat keine Größenbeschränkung noch Vorinitialisierung
  • class Vector4D: Array<Any> {} Ergebnisse in dem Fehler Inheritance from non-protocol, non-class type 'Array<Any>'
+0

Warum nicht einfach eine Struktur mit x, y, z, w Mitglieder? – emlai

+0

@tuple_cat, weil ich schließlich einen Typalias haben möchte, der ein 4 * 4 = 16 Elementarray –

+0

darstellt (nicht verwandt mit der Frage, aber beachten Sie, dass Ihr C-Beispielarray _not_ nicht vorinitialisiert ist: es enthält zufällige Werte.) – emlai

Antwort

1

Eine mögliche Lösung ist, eine Struktur mit einem statischen Elemente als Vorlage

struct Template { 
    static let vec4 = [Float](repeatElement(10.0, count: 4)) 
} 

var newVec = Template.vec4 
newVec[2] = 200.0 

Aufgrund der Werttyp-Semantik erhalten Sie immer eine Kopie von vec4.

+0

Ich mag diese Lösung, aber sagen wir, ich wollte "newVec" von einer Funktion zurückgeben. Was wäre der Rückgabetyp? –

+0

Es ist einfach '[Float]'. – vadian

+0

trotzdem kann ich Typen in einer Funktionsdeklaration erzwingen? Ich denke, ich muss das tun 'func multiplyMatrixAndMatrix (a: [Gleitkomma], b: [Gleitkomma]) -> [Gleitkomma] {' –

0

Sie können eine Struktur schreiben, die ein Array wickelt und bietet eine [] Betreiber:

struct Vec4<T> { 
    private var array: [T] 

    init(_ x: T, _ y: T, _ z: T, _ w: T) { 
     array = [x, y, z, w] 
    } 

    subscript(index: Int) -> T { 
     get { 
      return array[index] 
     } 
     set { 
      array[index] = newValue 
     } 
    } 
} 

Oder es effizienter zu machen:

struct Vec4<T> { 
    private var x, y, z, w: T 

    init(_ x: T, _ y: T, _ z: T, _ w: T) { 
     (self.x, self.y, self.z, self.w) = (x, y, z, w) 
    } 

    subscript(index: Int) -> T { 
     get { 
      switch index { 
       case 0: return x 
       case 1: return y 
       case 2: return z 
       case 3: return w 
       default: preconditionFailure("invalid Vec4 subscript index") 
      } 
     } 
     set { 
      switch index { 
       case 0: x = newValue 
       case 1: y = newValue 
       case 2: z = newValue 
       case 3: w = newValue 
       default: preconditionFailure("invalid Vec4 subscript index") 
      } 
     } 
    } 
} 
Verwandte Themen