<html><head><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}
h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}
h1 {
        color: #000000;
        font-size: 28pt;
}
h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}
h3 {
        font-size: 18px;
}
h4 {
        font-size: 16px;
}
h5 {
        font-size: 14px;
}
h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}
hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
display: inherit;
}
p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}
a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}
#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}
button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}
code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}
code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}
pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}
pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}
#ws { background-color: #f8f8f8; }
.bloop_markdown table {
border-collapse: collapse;
font-family: Helvetica, arial, freesans, clean, sans-serif;
color: rgb(51, 51, 51);
font-size: 15px; line-height: 25px;
padding: 0; }
.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }
.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }
.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }
.bloop_markdown blockquote{
border-left: 4px solid #dddddd;
padding: 0 15px;
color: #777777; }
blockquote > :first-child {
margin-top: 0; }
blockquote > :last-child {
margin-bottom: 0; }
code, pre, #ws, #message {
word-break: normal;
word-wrap: normal;
}
hr {
display: inherit;
}
.bloop_markdown :first-child {
-webkit-margin-before: 0;
}
code, pre, #ws, #message {
font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}
.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><p>I also would like to mention a problem I see with this ‘feature’.</p>
<p>Lets say this is my module:</p>
<pre><code class="swift">public struct A {
public var member1: Int = 42
public var member2: Int = 0 {
didSet {
self.member1 = self.member2
}
}
}
</code></pre>
<p>From a different project, that contains our module we want to observe the public properties:</p>
<pre><code class="swift">
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
</code></pre>
<p>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. </p>
<p>When we set <code>a.member2</code> the observer for <code>member1</code> on our side will be called first, follows by <code>member2</code> observer, which ‘might’ not be what we need.</p>
<p>I’d suggest that if this ‘feature’ might ever be considered for Swift that we should be able to set the execution order.</p>
<p>Bikeshedding: </p>
<pre><code class="swift">observe(first) // called before observer from the module are called
observe(last) // called after the observer from the module where called
</code></pre>
<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <br> <div id="bloop_sign_1467977167838386944" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">-- <br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 8. Juli 2016 um 13:22:45, Adrian Zubarev (<a href="mailto:adrian.zubarev@devandartist.com">adrian.zubarev@devandartist.com</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div></div><div>
<title></title>
<div class="bloop_markdown">
<p>Thats a good point!</p>
<p>Here is some bikeshedding:</p>
<pre><code class="swift">public extension UIViewController {
observe public var view: UIView {
willSet {
// do something useful here
}
didSet {
// do something useful here
}
}
}
</code></pre>
<p>An extra <code>observe</code> keyword might signal to the
compiler the correct intended usage.</p>
</div>
<div class="bloop_original_html">
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">
<br></div>
<br>
<div id="bloop_sign_1467976595189166080" class="bloop_sign">
<div style="font-family:helvetica,arial;font-size:13px">
-- <br>
Adrian Zubarev<br>
Sent with Airmail</div>
</div>
<br>
<p class="airmail_on">Am 8. Juli 2016 um 13:14:38, Leonardo Pessoa
(<a href="mailto:me@lmpessoa.com">me@lmpessoa.com</a>) schrieb:</p>
<blockquote type="cite" class="clean_bq">
<div>
<div><span>+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.<br>
<br>
On Friday, 8 July 2016, Adrian Zubarev via swift-evolution
<<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>>
wrote:<br></span>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word">
<div>
<p><span>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.</span></p>
<p><span>Lets say I’ve got a third party module and I want to know
when the a variable of some type has changed:</span></p>
<pre><span><code>extension UIViewController {
public override var view: UIView {
willSet {
// do something useful here
}
didSet {
// do something useful here
}
}
}
</code></span></pre>
<p><span>Wouldn’t be handy to inject custom <code>didSet</code> and
<code>willSet</code> functions into any property or computed
property?</span></p>
<p><span>This would also allow us to build a proper two-way-binding
mechanism.</span></p>
</div>
<div>
<div style="font-family:Helvetica,Arial;font-size:13px;color:rgba(0,0,0,1.0);margin:0px;line-height:auto">
<span><br></span></div>
<span><br></span>
<div>
<div style="font-family:helvetica,arial;font-size:13px">
<span>-- <br>
Adrian Zubarev<br>
Sent with Airmail</span></div>
</div>
</div>
</div>
</blockquote>
<span><br>
<br>
--<br>
L<br></span></div>
</div>
</blockquote>
</div>
<div class="bloop_markdown"></div>
</div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>