[swift-evolution] [Discussion] Allow injection of `didSet` and `willSet`

Adrian Zubarev adrian.zubarev at devandartist.com
Fri Jul 8 06:45:27 CDT 2016


I also would like to mention a problem I see with this ‘feature’.

Lets say this is my module:

public struct A {
     
    public var member1: Int = 42
     
    public var member2: Int = 0 {
         
        didSet {
             
            self.member1 = self.member2
        }
    }
}
From a different project, that contains our module we want to observe the public properties:


public extension A {
     
    observe public var member1: Int {
         
        didSet {
            // will be called first
        }
    }
     
    observe public var member2: Int {
         
        didSet {
            // will be called last
        }
    }
}

var a = A()
a.member1 // 42
a.member2 // 0

a.member2 = 100
a.member1 // 100
a.member2 // 100
It’s clear that we should decide on when our observer will be executed. In the example from above I pretended that my observer will be executed after the observer from the module itself.

When we set a.member2 the observer for member1 on our side will be called first, follows by member2 observer, which ‘might’ not be what we need.

I’d suggest that if this ‘feature’ might ever be considered for Swift that we should be able to set the execution order.

Bikeshedding:

observe(first) // called before observer from the module are called
observe(last) // called after the observer from the module where called


-- 
Adrian Zubarev
Sent with Airmail

Am 8. Juli 2016 um 13:22:45, Adrian Zubarev (adrian.zubarev at devandartist.com) schrieb:

Thats a good point!

Here is some bikeshedding:

public extension UIViewController {
       
    observe public var view: UIView {
           
        willSet {
            // do something useful here
        }
           
        didSet {
            // do something useful here
        }
    }
}
An extra observe keyword might signal to the compiler the correct intended usage.



-- 
Adrian Zubarev
Sent with Airmail

Am 8. Juli 2016 um 13:14:38, Leonardo Pessoa (me at lmpessoa.com) schrieb:

+1. This would allow us to create observers on any foreign variable. I'm far from a compiler right now but I wouldn't this syntax create a new variable instead of observing an existing one? Even if not, by reading this one could be mislead to believe so. Perhaps you should give it something to differentiate from creating a new var, for example by suppressing the type on this declaration.

On Friday, 8 July 2016, Adrian Zubarev via swift-evolution <swift-evolution at swift.org> wrote:
Hello dear Swift community, I’m not sure if this was discussed before or not, but I really want to know if something like this is welcome for the future Swift version. If this topic was already discussed, I’m apologizing for bringing it back to life in a new thread.

Lets say I’ve got a third party module and I want to know when the a variable of some type has changed:

extension UIViewController {
       
    public override var view: UIView {
           
        willSet {
            // do something useful here
        }
           
        didSet {
            // do something useful here
        }
    }
}
Wouldn’t be handy to inject custom didSet and willSet functions into any property or computed property?

This would also allow us to build a proper two-way-binding mechanism.



-- 
Adrian Zubarev
Sent with Airmail


--
L
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160708/6c42a17f/attachment.html>


More information about the swift-evolution mailing list