Swift: Inout-Parameter in Closures erfassen, die der aufgerufenen Funktion @ entgeh

Ich habe versucht, eine "Editor" -Klasse zu schreiben, die einen Verweis auf eine Eigenschaft eines anderen Objekts für eine spätere Mutation beibehalten kann. Ich schrieb zuerst die Redaktionsklasse, um einen Abschluss zum Lesen und einen Abschluss zum Schreiben zu erhalten. Das hat funktioniert. Ich habe dann versucht, den fraglichen Parameter als (inout) Referenz zu übergeben und daraus das Getter / Setter-Paar zu generieren. Das hat nicht funktioniert. In den Swift-Dokumenten heißt es (umschrieben), dass Swift herausfindet, wann kopiert werden muss und wann nicht. Ich glaube, ich bin mit der Unvorhersehbarkeit dieser Einschränkung konfrontiert, dachte aber, ich würde die Frage trotzdem stellen.

Alternativ ist es möglich, eine Curry-Funktion für den einzelnen Getter und Setter zu erhalten?

Mein Code ist:

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()

Die Ergebnisse sind:

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

Vielen Dank

Antworten auf die Frage(4)

Ihre Antwort auf die Frage