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
Спасибо!