<html><head></head><body><div>I was wondering if all mutating and setters of a method could become a type (Typename.Mutation), say something similar to an enum.</div><div><br></div><div>You’d use it like this:</div><div><br></div><div>let alice = john mutating [</div><div>&nbsp; .firstName = "Alice",</div><div>&nbsp; .makeScottishClan</div><div>]</div><div><br></div><div>See more here:</div><div><a dir="ltr" href="https://gist.github.com/BurntCaramel/ba2ce9dfd49595dacce07394de579172" x-apple-data-detectors="true" x-apple-data-detectors-type="link" x-apple-data-detectors-result="0">https://gist.github.com/BurntCaramel/ba2ce9dfd49595dacce07394de579172</a></div><div><br><div class="acompli_signature">Patrick</div><br></div><br><br><br>
<div class="gmail_quote">On Fri, Apr 22, 2016 at 12:18 AM -0700, "Vladimir.S 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>
<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">




<div dir="3D&quot;ltr&quot;">
<pre>Just wanted to summarize our opinions on this suggestion that we was 
discussing earlier and check if someone is ready to crate an "official" 
proposal for this feature.

There a number of questions regarding this feature we can discuss, for 
example statement vs method, what could be a placeholder of target instance 
inside the scope($0, $, _, .., nothing etc)

The main question, *do you support that we need "with" feature in some way 
in Swift 3.0 out of the box* . And if so, what variant do you prefer.

* this proposal is for *explicit* "with", where it is clear what 
method/property belongs to the "target" instance
* I believe that as such feature is really useful and handy, if it is 
explicit and if it is clearly showing in code what we are doing - we want 
to have this feature as part of language/standard lib rather than 
possibility to use some workaround to implement it
* It is not about saving the space in code. It is about more readable and 
(I insist) more stable(with less errors) code. Much less possibilities for 
copy-paste errors. Wrong code completion suggestion(by editor) can not 
produce error. It is explicit and clear, it has much less noise in code.
* Many of us already implemented and use such "with" construction in some way

There were 2 main suggestions :

1) Introduce "with" statement that can be used in for example in such way:

// set props just after creating
// similar to "if let.. " and "guard let.."
with let questionLabel = UILabel() {
   //set props of created instance here
   // here we can have:
   // $0.prop = value
   // or
   // ..prop = value
   // or
   // .prop = value
   // or
   // _.prop = value
   // or
   // $.prop = value
   // or ?
}
// questionLabel is available here


// works for structures
with var some = SomeStruct() {
   //...
}

// just for some class/structure/enum
with questionLabel {
   // ..
}

probably

with var src = someNamedInstance1,
      let dst = someNamedInstance2 {
    src.propA = dst.propB
    dst.someMethod(src.propC)
    src.someMehtod()
}

or
with someNamedInstance1, someNamedInstance2 {
    $0.propA = $1.propB
    $1.someMethod($0.propC)
    $0.someMehtod()
}


2) Introduce .with method for each(?) class/struct, so we can use out-of-box:

let questionLabel = UILabel().with {
   //set props of created instance here
   $0.prop = value
}

var someStructInstance = SomeStruct().with {target in
   target.prop = value
}

questionLabel.with {label in
   label.prop = value
}

someNamedInstance1.with(someNamedInstance2) {src, dst in
    src.propA = dst.propB
    dst.someMethod(src.propC)
    src.someMehtod()
}

Note that function like this :
func with<t>(item:T, apply:(T)-&gt;Void) {  apply(item) }

Produces such kind of problems:
struct A {var x = 1}
let a1 = A() // constant
with (a1) { $0.x = 10 } // this will be compiled without errors/warnings


On 13.04.2016 17:17, Radosław Pietruszewski via swift-evolution wrote:
&gt; It can be (more-or-less) solved in library code today:
&gt;
&gt;     extension NSObjectProtocol {
&gt;         public func with(@noescape fn: Self -&gt; Void) -&gt; Self {
&gt;             fn(self)
&gt;             return self
&gt;         }
&gt;     }
&gt;
&gt;
&gt; This way, you can do, on NSObjects:
&gt;
&gt;     textLabel.with {
&gt;
&gt;     $0.textAlignment = .Left
&gt;
&gt;     $0.textColor = .darkTextColor()
&gt;
&gt;     }
&gt;
&gt;
&gt; I love this pattern.
&gt;
&gt; You can also make it a function to make it work with any value of any kind
&gt; (it will then take form of `with(foo) { …}`).
&gt;
&gt; Ideally, if you could write a universal extension (something like
&gt; `extension Any`), you could just add this behavior, with method syntax, to
&gt; everything.
&gt;
&gt; — Radek
&gt;
&gt;&gt; On 13 Apr 2016, at 15:15, 李海珍 via swift-evolution
&gt;&gt; <swift-evolution@swift.org <mailto:swift-evolution@swift.org>&gt; wrote:
&gt;&gt;
&gt;&gt; I recently learned some VBA and I found a very conveniently `with` statement.
&gt;&gt;
&gt;&gt; `with` statement can be helpful to set property for UIKit instance.
&gt;&gt;
&gt;&gt; for instance a UILabel instance `textLabel` ,with `with` statement we can
&gt;&gt; set UILabel property like this
&gt;&gt;
&gt;&gt;
&gt;&gt; ```swift
&gt;&gt;
&gt;&gt; with textLabel{
&gt;&gt;
&gt;&gt; .textAlignment= .Left
&gt;&gt;
&gt;&gt; .textColor= UIColor.darkTextColor()
&gt;&gt;
&gt;&gt; .font= UIFont.systemFontOfSize(15)
&gt;&gt;
&gt;&gt; }
&gt;&gt;
&gt;&gt; ```
&gt;&gt;
&gt;&gt; _______________________________________________
&gt;&gt; swift-evolution mailing list
&gt;&gt; swift-evolution@swift.org <mailto:swift-evolution@swift.org>
&gt;&gt; https://lists.swift.org/mailman/listinfo/swift-evolution
&gt;
&gt;
&gt;
&gt; _______________________________________________
&gt; swift-evolution mailing list
&gt; swift-evolution@swift.org
&gt; https://lists.swift.org/mailman/listinfo/swift-evolution
&gt;
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution
</mailto:swift-evolution@swift.org></swift-evolution@swift.org></t></pre>
</div>

</blockquote>
</div>
</body></html>