<div dir="ltr">I would much prefer to see something like a &quot;with&quot; construct, which has been discussed previously in other threads. It would afford property-setting and also method calls, allowing people to build DSLs pretty easily. I don&#39;t feel that a multi-setter is particularly valuable as a special case.<div><br></div><div>object.{      // or &quot;with object {&quot;</div><div>    property1 = 1</div><div>    property2 = &quot;a&quot;</div><div>    method()</div><div>    ...</div><div>}<br><div class="gmail_extra"><br clear="all"><div><div><div dir="ltr"><div>Jacob Bandes-Storch<br></div></div></div></div>
<br><div class="gmail_quote">On Sun, Jan 10, 2016 at 12:21 PM, Michel Fortin 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">(This proposal came from thinking about the memberwise initializer proposal as well as older proposals for &quot;cascading&quot; and creating scopes making some members act like local variables.)<br>
<br>
I&#39;d like to propose a syntax to set multiple properties at once. It would look like this:<br>
<br>
        var object = MyObject()<br>
        object .= (<br>
                property1: 1,<br>
                property2: &quot;a&quot;<br>
        )<br>
<br>
and be equivalent to this:<br>
<br>
        var object = MyObject()<br>
        object.property1 = 1<br>
        object.property2 = &quot;a&quot;<br>
<br>
What the `.=` operator does is take each value in the tuple on the right and assign them to the property of the same name on the variable on the left. Assignments are performed in the same order as they&#39;re defined in the tuple.<br>
<br>
The tuple on the left of the `.=` operator can be written on the spot (as above) or be the result of an arbitrary expression, like here:<br>
<br>
        var object = MyObject()<br>
<br>
        var values = (property1: 1, property2: &quot;b&quot;)<br>
        object .= values<br>
<br>
        func makeValuesFor(value: Int) -&gt; (property1: Int, property2: String) {<br>
                return (value, &quot;\(value)&quot;)<br>
        }<br>
        object .= makeValuesFor(4)<br>
<br>
If the tuple contains property names that do not exist in the assigned variable, or if there is a mismatch in type or visibility and the assignment cannot happen, this is a compile-time error.<br>
<br>
This syntax is particularly beneficial when assigning to properties of a deeply nested value:<br>
<br>
        object.subpart.detail.numberPad .= (<br>
                radix: 9<br>
                position: .Top<br>
                font: .System<br>
        )<br>
<br>
<br>
## Tentative Implementation<br>
<br>
It&#39;s almost possible already to implement this with reflection. Here&#39;s an attempt (using a different operator name because `.=` doesn&#39;t work as a custom operator):<br>
<br>
        infix operator ~= {  }<br>
<br>
        func ~= &lt;T&gt;(inout target: T, values: (a: Int, b: String)) {<br>
                let valuesMirror = Mirror(reflecting: values)<br>
                let targetMirror = Mirror(reflecting: target)<br>
                valueLoop: for valueField in valuesMirror.children {<br>
                        guard let label = valueField.label else {<br>
                                fatalError(&quot;Missing label in value tuple.&quot;)<br>
                        }<br>
                        for targetField in targetMirror.children {<br>
                                print(targetField)<br>
                                if targetField.label == label {<br>
                                        targetField.value = valueField.value<br>
                                        continue valueLoop<br>
                                }<br>
                        }<br>
                }<br>
        }<br>
<br>
This fails because you can&#39;t assign to fields using the Mirror API. If this line could be replaced by something that works:<br>
<br>
        targetField.value = valueField.value<br>
<br>
then we could have a library implementation.<br>
<span><font color="#888888"><br>
<br>
--<br>
Michel Fortin<br>
<a href="https://michelf.ca" rel="noreferrer" target="_blank">https://michelf.ca</a><br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">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>
</font></span></blockquote></div><br></div></div></div>