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