[swift-evolution] "with" operator a la O'Caml?

Derrick Ho wh1pch81n at gmail.com
Mon Dec 19 12:36:17 CST 2016


struct Person {
Var name: String = ""

func with(name n: String) -> Person {
var a = self
a.name = name
return a
}
}

let andy = Person().with(name: "Andy")
let brandon = andy.with(name: "Brandon")
On Mon, Dec 19, 2016 at 10:28 AM Andy Chou via swift-evolution <
swift-evolution at swift.org> wrote:

> I like that structs are value types in Swift, this encourages the use of
> immutable data. O'Caml has an operator "with" that allows for copying an
> existing struct with a change to one field. I looked at Lenses for this
> functionality and it seems like a lot to digest for something so simple. I
> also tried to implement this using a constructor, or a function, and it was
> not obvious how to do so without a lot of code duplication.
>
> What's I'm looking for is something like this (not necessarily with this
> syntax):
>
> struct Person {
>     let name: String
>     let address: String
>     let phone: String
> }
>
> func f() {
>     let andy = Person(name: "Andy", address: "1 Battery St., San
> Francisco, CA", phone: "1234567")
>     let chris = andy.with(name: "Chris")
>     let dave = andy.with(address: "50 Townsend St., San Francisco, CA")
> }
>
> I tried to implement a "with" function like this but default arguments
> cannot reference properties of self. Same problem trying to do this in a
> constructor.
>
> Obviously it's possible to create an entirely new Person specifying the
> values from an existing Person, but this is very tedious with structures
> with many properties.
>
> Anyone taken a look at this before? Any suggestions?
>
> Andy
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161219/f29cfb54/attachment.html>


More information about the swift-evolution mailing list