[swift-users] Why inout protocol parameter in function work with strange
Седых Александр
se-a at mail.ru
Sat May 27 03:58:25 CDT 2017
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 at 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 at 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170527/5ceec9bc/attachment.html>
More information about the swift-users
mailing list