<div dir="ltr"><div>on Fri Jun 23 05:26:11 CDT 2017 Haravikk swift-evolution at <a href="http://haravikk.me">haravikk.me</a> wrote:</div><div><br></div><div>&gt; Not sure what you mean by added indirection here, the following seems perfectly straightforward to me:<br></div><div>&gt; </div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;         </span>protocol Foo {</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;                 </span>var someValue:Int { get set }</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;                 </span>func a() -&gt; Any?</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;         </span>}</div><div>&gt; <br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;         </span>extension Foo {</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;                 </span>func a() -&gt; Any? { return self.someValue }</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;         </span>}</div><div>&gt; <br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;         </span>struct ValueSemantics:Foo { var someValue:Int }</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;         </span>class ReferenceSemantics:Foo {</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;                 </span>var someValue:Int { return nil }</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">&gt;         </span>}</div><div>&gt; <br></div><div>&gt; There is no added access overhead here, the only difference is that the protocol itself leaves it up to </div><div>&gt; implementations whether someValue is stored or computed.</div><div><br></div><div>in real cases there would be more variables:</div><div><br></div><div><div>//============</div></div><div>protocol P1 {                       // #noise<br></div><div><div>    var var1: Int { get set }       // #noise</div><div>    var var2: Int { get set }       // #noise</div><div>    // ...                          // #noise x 100</div><div>    var var100: Int { get set }     // #noise</div><div>    </div><div>    func foo1() -&gt; Int              // #noise</div><div>    func foo2() -&gt; Int              // #noise</div><div>    // ...                          // #noise x 100</div><div>    func foo100() -&gt; Int            // #noise</div><div>}</div><div><br></div><div>extension P1 {                      // #noise</div><div>    func foo1() -&gt; Int { return var1 * 2 }</div><div>    func foo2() -&gt; Int { return var2 * 2 }</div><div>    // ...</div><div>    func foo100() -&gt; Int { return var100 * 2 }</div><div>}</div><div><br></div><div>struct S1: P1 {</div><div>    var var1: Int                   // #noise</div><div>    var var2: Int                   // #noise</div><div>    // ...                          // #noise x 100</div><div>    var var100: Int                 // #noise</div><div>}</div><div><br></div><div>class C1: P1 {</div><div>    var var1: Int = 0               // #noise</div><div>    var var2: Int = 0               // #noise</div><div>    // ...                          // #noise x 100</div><div>    var var100: Int = 0             // #noise</div><div>}</div><div><div>//============</div></div><div><br></div><div><br></div><div>lots of noise and violations of DRY. you may try to mitigate it by putting all those storage into another struct, that was the indirection i was thinking about:</div><div><br></div><div><div>//============</div></div><div>struct Pimpl {                      // #noise<br></div><div>    var var1: Int = 0</div><div>    var var2: Int = 0</div><div>    // ...</div><div>    var var100: Int = 0</div><div>    </div><div>    func foo1() -&gt; Int { return var1 * 2 }</div><div>    func foo2() -&gt; Int { return var2 * 2 }</div><div>    // ...</div><div>    func foo100() -&gt; Int { return var100 * 2 }</div><div>}</div><div><br></div><div>protocol P2 {                       // #noise</div><div>    var pimpl: Pimpl { get set }    // #noise</div><div>    </div><div>    func foo1() -&gt; Int              // #noise</div><div>    func foo2() -&gt; Int              // #noise</div><div>    // ...                          // #noise x 100</div><div>    func foo100() -&gt; Int            // #noise</div><div>}</div><div><br></div><div>extension P2 {                      // #noise</div><div>    func foo1() -&gt; Int { return pimpl.var1 * 2 }        // #indirection</div><div>    func foo2() -&gt; Int { return pimpl.var2 * 2 }        // #indirection</div><div>    // ...                                              // #indirection x 100</div><div>    func foo100() -&gt; Int { return pimpl.var100 * 2 }    // #indirection</div><div>}</div><div><br></div><div>struct S2: P2 {</div><div>    var pimpl: Pimpl                // #noise</div><div><br></div><div>    init() {</div><div>        pimpl = Pimpl()             // #noise</div><div>    }</div><div>}</div><div><br></div><div>class C2: P2 {</div><div>    var pimpl: Pimpl                // #noise</div><div>    </div><div>    init() {</div><div>        pimpl = Pimpl()             // #noise</div><div>    }</div><div>}</div><div>//============</div><div><br></div><div>while the proposed solution has minimal amount of noise:</div><div><br></div><div><div>//============</div></div><div>struct S3 {<br></div><div>    var var1: Int</div><div>    var var2: Int</div><div>    // ...</div><div>    var var100: Int</div><div>    </div><div>    func foo1() -&gt; Int { return var1 * 2 }</div><div>    func foo2() -&gt; Int { return var2 * 2 }</div><div>    // ...</div><div>    func foo100() -&gt; Int { return var100 * 2 }</div><div>}</div><div><br></div><div>class C3: S3 {</div><div>}</div><div>// ===========</div></div><div><br></div><div>Mike</div><div><br></div></div>