<div dir="ltr">Built-in lenses would solve this issue and much more, didn&#39;t know it was on the list already!</div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><div dir="ltr" style="font-size:12.8px"><div dir="ltr" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px"><font face="arial,helvetica,sans-serif" color="#000000" style="font-size:12.8px"><b>Austin Feight </b>|<b> </b>Chief Shipping Officer</font></div><div dir="ltr" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px"><font color="#000000" face="arial, helvetica, sans-serif"><br></font></div><div dir="ltr" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small"><font color="#000000" face="arial, helvetica, sans-serif" style="font-size:12.8px"><img src="https://docs.google.com/uc?export=download&amp;id=0B4l6EHVu_9V1bXE4ZTd3MWY3bmc&amp;revid=0B4l6EHVu_9V1YTdNenBVcnpZTGVIdUlJS0M3Q3BSR1hQSFJvPQ"><br></font><div><div style="font-size:12.8px"><span style="color:rgb(102,102,102);font-size:12.8px;font-family:arial,helvetica,sans-serif">150 E. 52nd Street, 22nd Floor, New York, NY 10022</span></div><div><span style="border-collapse:collapse"><font color="#999999" face="Tahoma"><span style="font-size:12px"><a href="http://www.coatchex.com/" style="color:rgb(17,85,204)" target="_blank">www.chexology.com</a> | <a href="http://www.austindfeight.com" style="color:rgb(17,85,204)" target="_blank">www.austindfeight.com</a></span></font></span></div></div></div></div></div></div></div></div></div></div></div></div></div>
<br><div class="gmail_quote">On Tue, Jun 28, 2016 at 7:33 PM, Michael Peternell via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Haha, I think if we support lenses we should also support a QBit structure, because lenses are just special cases for QBits ;) That said, I think it&#39;s unlikely that lenses will be supported in Swift 4. We should wait for Swift 5 when the full QBit-library will be introduced (hardware-accellerated of course, but it deploys back until the iPhone 6S.)<br>
<br>
Good night guys (it&#39;s 1:30 am in my time zone...)<br>
<br>
-Michael<br>
<div class="HOEnZb"><div class="h5"><br>
&gt; Am 29.06.2016 um 01:22 schrieb Sean Heber via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;:<br>
&gt;<br>
&gt; Lens are a term from functional programming theory (I think largely Haskell in particular?). I don&#39;t know much about it, but here&#39;s somewhere to start: <a href="https://www21.in.tum.de/teaching/fp/SS15/papers/17.pdf" rel="noreferrer" target="_blank">https://www21.in.tum.de/teaching/fp/SS15/papers/17.pdf</a><br>
&gt;<br>
&gt; l8r<br>
&gt; Sean<br>
&gt;<br>
&gt; Sent from my iPad<br>
&gt;<br>
&gt; On Jun 28, 2016, at 6:11 PM, Michael Peternell via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt; Really?? Or we just have #set and #get and no lenses, and it&#39;s done for Swift 3?<br>
&gt;&gt;<br>
&gt;&gt; I never heard of lenses (Google does not help here). Was this serious or were you joking? Unless you can explain why #set and #get without lenses would be bad... or maybe #set and #get *are* lenses, in which case I&#39;m not sure what you were trying to say. Reflexion -&gt; Reflection?<br>
&gt;&gt;<br>
&gt;&gt; -Michael<br>
&gt;&gt;<br>
&gt;&gt;&gt; Am 29.06.2016 um 00:55 schrieb David Hart via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This looks like lenses. I think we need to wait until after Swift 3 to discuss it, and come up with a bigger design that ties to reflexion.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; On 28 Jun 2016, at 22:04, Michael Peternell via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; So you&#39;re proposing that `#set(aVariableName)` should translate to `{aVariableName=$0}`, right? Where aVariableName can be any valid lvalue like `self.users` or `users` or `vc.viewControllers`..<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; I think this would be a good extension to Swift. (`users.set` does not work BTW, because maybe the `users` object has a `set` property.. maybe I wanted to refer to the `set` property which also happens to refer to a closure value.)<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; `#set(aVariableName)` also feels consistent with the `#keyPath(aVariableName)` property and falls into a similar category. Maybe `#setter(aVariableName)` would be even more clear? Furthermore, I want to additionally propose to introduce `#get(aVariableName)` (or `#getter(aVariableName)`) too.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; -Michael<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Am 28.06.2016 um 20:18 schrieb Austin Feight via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Proposal:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; I propose adding setter methods to vars, which could look something like this: `ApiClient().fetchUsers().then(#set(users))`<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Initially I thought it should work like this: `ApiClient().fetchUsers().then(users.set)`<br>
&gt;&gt;&gt;&gt;&gt; but to accomplish a line of code that flows grammatically, I believe putting &quot;set&quot; where it would naturally fall if the code was being read as a sentence is more Swifty.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Rationale:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; The following code makes me smile:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; ApiClient().fetchUsers().then(displayUsers)<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; It exemplifies the beauty of Swift. First-class functions make this line of code read very well. Consider some alternatives:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; 1. ApiClient().fetchUsers().then { displayUsers($0) }<br>
&gt;&gt;&gt;&gt;&gt; 2. ApiClient().fetchUsers().then { users in displayUsers(users) }<br>
&gt;&gt;&gt;&gt;&gt; 3. ApiClient().fetchUsers().then { (users: [User]) in displayUsers(users) }<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Using the lessons learned from Swift API Design Guidelines (WWDC 2016 Session 403) having an emphasis on clarity, my analysis of the alternatives is:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; 1. $0 adds no additional information as to the type or explanation of what the argument is, thus adding nothing to the line of code for clarity, and therefore should be omitted<br>
&gt;&gt;&gt;&gt;&gt; 2. adding &quot;users&quot; also adds nothing to the clarity of the code. The function, properly, contains the information necessary to reason about the argument it takes and what it does, and therefore adding &quot;users&quot; is redundant<br>
&gt;&gt;&gt;&gt;&gt; 3. Not only is &quot;users&quot; redundant, but also is the explicit type label. The `displayUsers` method will only accept one type of argument, so we&#39;re duplicating information that the compiler (and autocomplete) already gives us<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; With this I conclude that `ApiClient().fetchUsers().then(displayUsers)` is the Swiftiest option.<br>
&gt;&gt;&gt;&gt;&gt; I want to extend this same logic to when I find myself writing code like this:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; ApiClient().fetchUsers().then { users in<br>
&gt;&gt;&gt;&gt;&gt; self.users = users<br>
&gt;&gt;&gt;&gt;&gt; }<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; or alternatively, because &quot;users&quot; is likely redundant information again,<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; ApiClient().fetchUsers().then { self.users = $0 }<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Personally I steer clear of `$0` as much as possible, because I very rarely feel that it provides the information necessary for code clarity. But beyond that, this code no longer reads as nicely as the code we had before.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Whereas `ApiClient().fetchUsers().then(displayUsers)` flows nicely as a sentence and reads grammatically, `ApiClient().fetchUsers().then { self.users = $0 }` no longer does.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; I think this feature could have a simple implementation where the compiler replaces `#set(X)` with `{ X = $0 }`, and I believe it would go a long way with respect to code clarity, especially when X is something longer like `self.view.bounds.origin.x`<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Looking forward to hearing thoughts from the community,<br>
&gt;&gt;&gt;&gt;&gt; Austin Feight<br>
&gt;&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt;&gt; swift-evolution mailing list<br>
&gt;&gt;&gt;&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt;&gt;&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt; swift-evolution mailing list<br>
&gt;&gt;&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt;&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; swift-evolution mailing list<br>
&gt;&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; swift-evolution mailing list<br>
&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</div></div></blockquote></div><br></div>