Swift: захватывает входной параметр в замыканиях, которые экранируют вызываемую функцию

Я попытался написать класс «редактор», который может сохранить ссылку на свойство в другом объекте для последующей мутации. Сначала я написал класс редактора, чтобы получить закрытие для чтения и закрытие для записи. Это сработало. Затем я попытался передать рассматриваемый параметр по ссылке (inout), а затем сгенерировать из этого пару получатель / установщик. Это не сработало. Документы Swift говорят (перефразируя), что Swift выясняет, когда копировать, а когда нет. Я думаю, что столкнулся с непредсказуемостью этого ограничения, но подумал, что задам вопрос точно так же.

Альтернативно, возможно ли получить функцию карри для отдельного геттера и сеттера?

Мой код:

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

Результаты:

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

Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос