In your example, the compiler needs a parameter of type Position. Car is a type 
of Position, but they are not interchangeable. See below:

> On May 26, 2017, at 00:33, Седых Александр via swift-users 
> <swift-users@swift.org> wrote:
> 
> protocol Position {
>     var x: Double { getset }
> }
>  
> struct Car: Position {
>     var x: Double
> }
>  
> func move(item: inout Position) {
>     item.x += 1
> }
>  
> var car = Car(x: 50)

var pos: Position = car

move(item: &pos)    // this works.
assert(pos.x == 51) // works

The move function as you wrote it requires the memory representation of a 
Position variable, which Car does not have; when you assign it to a Position 
variable, the Car struct gets accessed through an indirection layer. (There was 
a WWDC talk about this last year or the year before.)

You may want a generic function instead:

func move<P: Position>(item: inout P) {
  item.x += 1
}

move(item: &car)    // this works, since it’s now calling the generic function.
assert(car.x == 51) // works

Cheers,
Guillaume Lessard

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to