2014-10-18 17 views
11

Se ho una struttura esistente, ma voglio usare il comportamento "Riferimento", come posso ottenerlo?Come passare la struttura per riferimento?

posso scrivere qualche semplice classe titolare come

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

Credo che ci deve essere di classe pronto nella libreria standard, ma non ho trovato.

Voglio memorizzare quel riferimento nella mia classe, quindi il parametro inout non è quello che mi serve.

+0

Sarebbe un 'class' essere più adatto per i vostri scopi? Sono passati per riferimento. Le istanze di 'struct' sono progettate per essere passate per valore. – sapi

+0

Questo risolverebbe il mio problema, ma ciò significa che devo duplicare la struttura del framework esistente come CGRect e implementare le conversioni avanti e indietro. Voglio evitare la duplicazione, se possibile. – vbezhenar

+0

@sapi: tutto in Swift viene sempre passato per valore, a meno che il parametro non sia contrassegnato come "inout", nel qual caso viene sempre passato per riferimento. – newacct

risposta

7

Per me la migliore variante stava usando class-titolare:

class Ref<T> { 
    var value: T 

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

È possibile, ma non è necessario memorizzarlo nella classe.

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 

Perché, di solito, struct è assegnato dalla memoria "stack", quando si esegue in questo modo:

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

let rect = makeRect() 

rect.sizeRef più punti memoria valida. UnsafeMutablePointer è non sicuro in senso letterale.

Problemi correlati