[swift-evolution] A shortcut for weakly referencing functions
Radosław Pietruszewski
radexpl at gmail.com
Fri Apr 1 10:09:19 CDT 2016
Here’s a pattern I find myself doing quite often:
1> class Child {
2. var onSomeEvent: () -> Void = { }
3. }
4> class Parent {
5. let child = Child()
6. init() {
7. child.onSomeEvent = doSomething
8. }
9. func doSomething() {
10. }
11. }
I have some ownership hierarchy of classes (often controllers — view controllers — views), where I pass information from children up to parents using closures set by the parent.
I like this pattern because children classes don’t have to be tied to knowledge about their parents, and I don’t have to define delegate protocols. It’s very clean, and also very easy to set up.
The only problem is that there’s a strong danger of introducing reference cycles.
With class properties, you can quite easily see the potential for a reference cycle and mark references to parents with weak/unowned. And with `self` captures in closures, you’re reminded of memory management by having to be explicit about `self`. But when passing references from parents to children, there’s no way to mark the closure property as `weak` (and there’s no reminder of the danger).
* * *
Right now, every time I pass a closure down to children, I have to wrap my references like so:
{ [unowned self] self.doSomething($0) }
instead of a neat and simple function reference:
doSomething
I think it would be useful to have a shortcut syntax for creating weak and unowned references to functions, like so:
@unowned(doSomething)
or perhaps:
#unowned(self.doSomething)
* * *
An alternative would be the ability to mark closure properties as weak or unowned. Then I could, at the *child* level, say:
unowned let onSomeEvent: () -> Void
* * *
Does this make sense? What do you think?
— Radek
More information about the swift-evolution
mailing list