You can’t pass a `let` as an `inout` argument. I’d guess that’s what’s 
happening is the `arr[2]` part is creating a temporary var to which the `&` 
part then provides a reference. `b` is then dutifully modified in the function, 
but there’s no mechanism for copying it back into `arr` when `foo` returns, so 
the change isn’t reflected at the call site.

I *think* that the documentation you’re referring to in your last sentence is 
talking about when the value is updated at the call site. That is, `arr` itself 
isn’t updated until `foo` returns, but within `foo`, the argument `a` would 
have whatever value you assign it, whenever you assign it.

I think.

HTH (also, I hope I’m right… the only thing worse that no info is bad info)
- Dave Sweeris

> On Jun 11, 2016, at 12:29 PM, Karl Pickett via swift-users 
> <swift-users@swift.org> wrote:
> 
> I don't believe the (spartan) docs address this case:
> 
> func foo(inout a: [Int], inout b: Int) {
>    let acopy = a
>    a = [4, 5, 6]
>    print(acopy)  // prints "[1, 2, 3]"
>    b = 99
>    print(a)   // prints "[4, 5, 6]"
>    print(acopy)  // prints "[1, 2, 99]" (e.g. a let variable changed!)
> }
> 
> var arr = [1,2,3]
> 
> foo(&arr, b: &arr[2])
> 
> print(arr)  // prints "[4, 5, 6]"
> 
> 
> Is this code "undefined", meaning the spec / doc doesn't specifically
> say what should be happening?  For instance, I can't believe a let
> variable gets changed.  The docs also say inout changes the original
> value when the function ends, not in the middle as is happening here.
> _______________________________________________
> swift-users mailing list
> 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

Reply via email to