On May 27, 2017, at 03:07, Zhao Xin via swift-users <swift-users@swift.org> wrote:
Because generic uses `Car` instead of `Position` when running the code, so there is no casting as `car as Position` as in your original code. The `T:Position` part restricts that the type conforms `Position`, but it won't use `Position`, it uses the type.
Zhaoxin
On Sat, May 27, 2017 at 4:58 PM, ะกะตะดัั
ะะปะตะบัะฐะฝะดั via swift-users <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
Thanks. Why generic function don not require memory allocate for inout variable, even if it is protocol type?
ะััะฝะธัะฐ, 26 ะผะฐั 2017, 19:35 +03:00 ะพั Guillaume Lessard <glessard@tffenterprises.com <mailto:glessard@tffenterprises.com>>:
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 <mailto: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 <mailto:swift-users@swift.org>
https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users