Swift: captura el parámetro inout en cierres que escapan de la función llamada

Traté de escribir una clase de "editor" que pudiera retener una referencia a una propiedad en un objeto diferente para una mutación posterior. Primero escribí la clase del editor para recibir un cierre por lectura, y un cierre por escritura. Esto funcionó. Luego intenté pasar el parámetro en cuestión por referencia (inout) y luego generar el par getter / setter a partir de eso. Esto no funcionó. Los documentos de Swift dicen (parafraseando) que Swift determina cuándo copiar y cuándo no. Creo que estoy en contra de la imprevisibilidad de esa limitación, pero pensé en plantear la pregunta de la misma manera.

Alternativamente, ¿es posible obtener una función curry para el getter y setter individual?

Mi código es:

class SomeModel : Printable {

    var a:String

    init(a:String) {
        self.a = a
    }

    var description:String {
        return "\(self.a)"
    }
}


class Editor {

    var getter:()-> String
    var setter:(String)->()

    init(getter:()-> String, setter:(String)->()) {
        self.getter = getter
        self.setter = setter
    }

    convenience init(inout bindTo:String) {
        self.init(
            getter:{ return bindTo },
            setter: { v in bindTo = v })
    }

    func read() -> String {
        return self.getter()
    }

    func write(value:String) {
        self.setter(value)
    }
}


func testBindTo() {
    var readModel =  SomeModel(a:"Did not capture by reference");
    var bindForReading = Editor(bindTo: &readModel.a)
    readModel.a = "captured by reference!"
    println(bindForReading.read())

    var writeModel =  SomeModel(a:"Did not capture by reference");
    var bindForWriting = Editor(bindTo: &writeModel.a)
    bindForWriting.write("captured by reference")
    println(writeModel)
}

testBindTo()


func testExplicitGetterSetter() {

    var readModel =  SomeModel(a:"Did not capture by reference");
    var bindForReading = Editor(
        getter: { readModel.a },
        setter: { v in readModel.a = v })
    readModel.a = "captured by reference!"
    println(bindForReading.read())

    var writeModel =  SomeModel(a:"Did not capture by reference");
    var bindForWriting = Editor(
        getter: { writeModel.a },
        setter: { v in writeModel.a = v })
    bindForWriting.write("captured by reference")
    println(writeModel)     
}

testExplicitGetterSetter()

Los resultados son:

Did not capture by reference
Did not capture by reference
captured by reference!
captured by reference

¡Gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta