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@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@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution >
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution