2014-10-18 14 views
11

Wenn ich eine vorhandene Struktur habe, aber ich möchte "Referenz" Verhalten verwenden, wie erreiche ich das?Wie man Struktur als Referenz übergeben?

kann ich einige einfache Klasse Halter wie

class Box<T> { 
    var value: T 
    init(_ value: T) { 
     self.value = value 
    } 
} 

schreibe ich denke, es gibt in der Standard-Bibliothek bereit Klasse sein muss, aber ich fand es nicht.

Ich möchte diese Referenz in meiner Klasse speichern, so inout Parameter ist nicht das, was ich brauche.

+0

Würde für Ihre Zwecke ein 'CLASS' besser geeignet sein? Sie werden als Referenz weitergegeben. Instanzen von 'struct' sind so konzipiert, dass sie als Wert übergeben werden. – sapi

+0

Das würde mein Problem lösen, aber das bedeutet, dass ich bestehende Framework-Struktur wie CGRect duplizieren und Konvertierungen hin und her implementieren muss. Ich möchte, wenn möglich, Doppelarbeit vermeiden. – vbezhenar

+0

@sapi: Alles in Swift wird immer als Wert übergeben, es sei denn, der Parameter ist mit 'inout' gekennzeichnet. In diesem Fall wird er immer als Referenz übergeben. – newacct

Antwort

7

Für mich ist die beste Variante Klasse Halter wurde mit:

class Ref<T> { 
    var value: T 

    init(_ value: T) { 
    self.value = value 
    } 
} 
6

Sie können, aber Sie sollten es nicht in Ihrer Klasse speichern.

struct Size { 
    var width:Float 
    var height:Float 
} 

class Rect { 
    var sizeRef:UnsafeMutablePointer<Size> 
    init(_ size:UnsafeMutablePointer<Size>) { 
     self.sizeRef = size 
    } 
    func doubleSize() { 
     self.sizeRef.memory.height *= 2.0 
     self.sizeRef.memory.width *= 2.0 
    } 
} 

var size = Size(width: 20.0, height: 20.0) 
let rect = Rect(&size) 
rect.doubleSize() 
println("size: \(size.width) x \(size.height)") // -> size: 40.0 x 40.0 

Denn in der Regel, struct von "Stack" Speicher zugewiesen wird, wenn Sie wie folgt vorgehen:

func makeRect() -> Rect { 
    var size = Size(width: 20.0, height: 20.0) 
    return Rect(&size) 
} 

let rect = makeRect() 

rect.sizeRef nicht mehr gültig Speicher verweist. UnsafeMutablePointer ist unsicher im wörtlichen Sinne.

Verwandte Themen