I’m confused by your example below. Your move() function is equivalent to this:

func move(position: Position) {
    var copy = position
    copy.x += 20
}

Did you mean “var” there? (sidenote: var is being removed from the function 
call site)

Structs are immutable. It’s only with a var-declaration and a mutating function 
or it’s exposed properties, or the passing via inout, that structs appear to 
become immutable, but even that is a copy-on-write behavior. Like others have 
mentioned, the optimizer can remove this copy in many places for efficiency 
gains.

For instance, this is how you would change the incoming struct:

func move(inout position: Position) {
    position.x += 20
}

var p1 = Position(x: 10, y: 10)
move(&p1)

This will print 30 both with struct or class.

> 1) The choice between classes and structures isn’t clear right now. If 
> structures were immutable it would be natural to use them as value objects.


If you have a value-type type and it supports equality, then a struct is the 
“right” choice. That’s the basic guideline. So anything you wish to treat as a 
value and have value-semantics (which is basically copy-on-write), use a 
struct. That seems like what you are saying, and that’s already the case.

> 2) Refactoring a mutable structure into a class when it’s being passed around 
> multiple threads removes the by-value semantics seamlessly. The resulting 
> mutable class isn’t thread-safe.


Classes, by definition, remove value-semantics. I agree that this type of 
refactoring is inherently fragile, but I don’t see how having “immutable” 
structs changes this. 

-David

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to