У меня есть протокол с методом. Я подумал, что методы могут быть заменены затворами одним и тем же именем, но это не похоже на работу:Удовлетворительные методы протокола Swift с атрибутами закрытия?
protocol Foo {
func bar() // Type: Void -> Void
}
class X: Foo {
func bar() { }
}
class Y: Foo { // Compiler: doesn't conform to protocol Foo
let bar: Void->Void = {}
}
Есть ли способ, чтобы сделать эту работу? Я хочу переопределить поведение методов для реализации Test Stub. В настоящее время, я должен был бы сделать это, что я хотел бы сократить:
class Z: Foo {
var barClosure: Void -> Void = {}
func bar() {
barClosure()
}
}
let baz = Z()
baz.barClosure = { /* ... */ }
baz.bar() // Calls the closure replacement
Таким образом, 'func' и замыкания никогда не являются взаимозаменяемыми. Я должен решить, как это должно выглядеть в определении класса. С точки зрения клиента, оба они называются одинаково. Почему вы предоставили '_bar' дополнительно, когда' bar' сам настроен? – ctietze
Я бы сказал, что func и vaiables не взаимозаменяемы. У меня была переменная _bar, чтобы избежать бесконечных циклов. (см. это: http://stackoverflow.com/questions/25828632/swift-custom-setter-on-property) Но я обновлю свой ответ, чтобы предоставить вам более короткое решение проблемы. –
@ctietze приветствуется! –