<html><head><style>body{font-family:Helvetica,Arial;font-size:13px}</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><div id="bloop_customfont" style="margin: 0px;">I know that this might be a bit confusing but at least for a syntax highlighting editor this shouldn’t be a problem. Any custom function is displayed with a different color (at least Xcode do).</div><div id="bloop_customfont" style="margin: 0px;"><br></div><div id="bloop_customfont" style="margin: 0px;">For structs one could use:</div><div id="bloop_customfont" style="margin: 0px;"><br></div><div id="bloop_customfont" style="margin: 0px;"><div id="bloop_customfont" style="margin: 0px;">struct B { var x = 10 }</div><div id="bloop_customfont" style="margin: 0px;"><br></div><div id="bloop_customfont" style="margin: 0px;">func with&lt;T&gt;(lhs: T, rhs: (inout T) -&gt; Void) -&gt; T {</div><div id="bloop_customfont" style="margin: 0px;"><br></div><div id="bloop_customfont" style="margin: 0px;"></div><div id="bloop_customfont" style="margin: 0px;">&nbsp; &nbsp;var mutableValue = lhs</div><div id="bloop_customfont" style="margin: 0px;">&nbsp; &nbsp;rhs(&amp;mutableValue)</div><div id="bloop_customfont" style="margin: 0px;">&nbsp; &nbsp;return mutableValue</div><div id="bloop_customfont" style="margin: 0px;">}</div><div id="bloop_customfont" style="margin: 0px;"><br></div><div id="bloop_customfont" style="margin: 0px;">let value = B() with {</div><div id="bloop_customfont" style="margin: 0px;"><br></div><div id="bloop_customfont" style="margin: 0px;"></div><div id="bloop_customfont" style="margin: 0px;">&nbsp; &nbsp;$0.x = 40</div><div id="bloop_customfont" style="margin: 0px;">}</div><div id="bloop_customfont" style="margin: 0px;"><br></div><div id="bloop_customfont" style="margin: 0px;">This does even supports Swifty mutation if needed.</div><div id="bloop_customfont" style="margin: 0px;"><br></div><div id="bloop_customfont" style="margin: 0px;">`with` statement is just a single example we could create with infix functions.</div><div><br></div></div></div> <br> <div id="bloop_sign_1461356100088779008" class="bloop_sign"><div>--&nbsp;<br>Adrian Zubarev</div></div> <br><p class="airmail_on">Am 22. April 2016 bei 22:05:11, Vladimir.S via swift-evolution (<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div><div></div><div>On 22.04.2016 22:06, Adrian Zubarev via swift-evolution wrote:<br>&gt; I’d like to throw an idea in the room and see where this will go.<br>&gt;<br>&gt; What if Swift would allow us to create custom infix functions?<br>&gt; Does Swift need to ability of infix functions?<br>&gt; How powerful can such a feature be?<br>&gt; Pros and cons?<br>&gt;<br>&gt; There is a discussion about the `with` statement which we could develop<br>&gt; with infix functions like so:<br><br>IMO Such construction will looks like a language construction and will <br>confuse.<br><br>And the function you suggest as replacement for "with" feature will *not* <br>correctly handle struct instances (Swift 3.0 mar 24):<br><br>struct B { var x = 10 }<br><br>func with&lt;T: AnyObject&gt;(lhs: T, rhs: @noescape (T) -&gt; Void) {  rhs(lhs)  }<br><br>var b2 = B()<br>with(b2) { print($0.x) }<br><br>It will produce this error :<br>--------------<br>Error running code:<br>l-value expression does not have l-value access kind set<br>...<br>-------------<br><br>This is why I propose to introduce standard "with" feature(language feature <br>or built-in method(s)/free function(s)) in Swift out-of-box i.e. tested and <br>well-working solution in any situation. Not some hack/workaround that each <br>one will write for himself and that will not work in some situation.<br><br>I can implement "with" method in some way for struct that will work like this:<br><br>struct B {<br>        var x = 10<br><br>        mutating func withInPlace(user: @noescape (inout B)-&gt;Void) -&gt; B {<br>                var copy = self<br>                user(&amp;copy)<br>                self = copy<br>                return self<br>        }<br><br>        func with(user: @noescape (inout B)-&gt;Void) -&gt; B {<br>                 var copy = self<br>                user(&amp;copy)<br>                return copy<br>        }<br>}<br><br>var b1 = B().with {<br>     $0.x = 100<br>}<br><br>print("created b1.x = ", b1.x)<br><br>b1.withInPlace { $0.x = 1000 }<br><br>let c1 = b1.with {<br>     print("b1.x = ", $0.x)<br>     $0.x = 2000<br>}<br><br>print("b1.x = ", b1.x)<br>print("c1.x = ", c1.x)<br><br>But again, this is custom solution, we need standard and tested way to do this.<br><br><br>&gt;<br>&gt; infix func with&lt;T: AnyObject&gt;(lhs: T, rhs: @noescape (T) -&gt; Void) {<br>&gt;<br>&gt; rhs(lhs)<br>&gt; }<br>&gt;<br>&gt; class A {<br>&gt;<br>&gt; func foo() {}<br>&gt; }<br>&gt;<br>&gt; let instance: A = A() with {<br>&gt;<br>&gt; $0.foo()<br>&gt; }<br>&gt;<br>&gt; So what does the Swift community think about that idea?<br>&gt;<br>&gt; --<br>&gt; Adrian Zubarev<br>&gt;<br>&gt;<br>&gt; _______________________________________________<br>&gt; swift-evolution mailing list<br>&gt; swift-evolution@swift.org<br>&gt; https://lists.swift.org/mailman/listinfo/swift-evolution<br>&gt;<br>_______________________________________________<br>swift-evolution mailing list<br>swift-evolution@swift.org<br>https://lists.swift.org/mailman/listinfo/swift-evolution<br></div></div></span></blockquote></body></html>