Swift: captura o parâmetro inout em fechamentos que escapam à função chamada
Tentei escrever uma classe "editor" que pudesse manter uma referência a uma propriedade em um objeto diferente para posterior mutação. Primeiro escrevi para a turma do editor para receber um encerramento para leitura e um encerramento para escrita. Isso funcionou. Tentei passar o parâmetro em questão por referência (inout) e gerar o par getter / setter a partir disso. Isso não funcionou. Os documentos do Swift dizem (parafraseando) que o Swift descobre quando copiar e quando não copiar. Acho que sou contra a imprevisibilidade dessa limitação, mas pensei em colocar a questão da mesma forma.
Como alternativa, é possível obter uma função ao curry para o getter e setter individual?
Meu código é:
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()
Os resultados são:
Did not capture by reference
Did not capture by reference
captured by reference!
captured by reference
Obrigado!