2014-12-18 6 views
7

würde ich eine Funktion wie eine Referenz eines Arrays zurück:Wie kann man eine Inout (Referenz) in einer schnellen Funktion zurückgeben?

var a = [1, 2] 
var b = [3, 4] 

func arrayToPick(i:Int) -> [Int] { 
    return i == 0 ? a : b 
} 

inout var d = arrayToPick(0) 
d[0] = 6 

println(a[0]) // 1 
println(d[0]) // 6 

Ich bin nicht in der Lage &a oder &b in arrayToPick zurückkehren, weil diejenigen, die nicht zu [Int] gegossen werden können.

Wie kann eine Referenz auf a oder b von einer Funktion zurückgegeben werden?

Antwort

11

Sie können den Wert inout nicht zurückgeben. Weil der Compiler die Lebensdauer des Wertes nicht garantieren kann.

Sie haben unsicher Art und Weise, wie folgt aus:

var a = [1, 2] 
var b = [3, 4] 

func arrayToPick(i:Int) -> UnsafeMutablePointer<[Int]> { 
    if i == 0 { 
     return withUnsafeMutablePointer(&a, { $0 }) 
    } 
    else { 
     return withUnsafeMutablePointer(&b, { $0 }) 
    } 
} 

var d = arrayToPick(0) 
d.memory[0] = 6 

println(a[0]) // -> 6 

In diesem Fall wird nach a freigegeben wird, d.memory Zugang BAD_ACCESS Fehler verursachen kann.

Oder sicher Art und Weise, wie folgt aus:

var a = [1, 2] 
var b = [3, 4] 

func withPickedArray(i:Int, f:(inout [Int]) -> Void) { 
    i == 0 ? f(&a) : f(&b) 
} 

withPickedArray(0) { (inout picked:[Int]) in 
    picked[0] = 6 
} 

println(a[0]) // -> 6 

In diesem Fall können Sie das aufgenommene Wert nur in der Schließung zugreifen.

+1

Warum kann swift nicht einfach Referenzzählung durchführen und die Lebensdauer des Objekts garantieren, wo es benötigt wird? – Droopycom