I have been looking at the parts of this proposal related to 
withUnsafe[Mutable]Pointer:

- https://bugs.swift.org/browse/SR-1937: 
<https://bugs.swift.org/browse/SR-1937:> withUnsafePointer(&x) should have an 
argument label 'to:’
- https://bugs.swift.org/browse/SR-1956: 
<https://bugs.swift.org/browse/SR-1956:> `withUnsafePointer` shouldn't take its 
argument as `inout`

Adding the “to:” argument label seems like an obviously good thing to do for 
the one-argument version of these functions. Besides that, I'd like to suggest 
that we remove the 2- and 3-argument versions: withUnsafe[Mutable]Pointers. The 
naming is already different than the 1-argument functions (plural vs. singular) 
and the argument label doesn't work so well with multiple arguments. These 
extra functions are not a complete solution (if you need more than 3 arguments) 
and they're not used much -- there is only one real use in the stdlib, with one 
more use in a validation-test. We can replace them by composing nested uses of 
the 1-argument functions in the few places where they are needed. I have 
already prototyped that and it seems to work fine.

It is not so clear what to do about SR-1956. (Charlie and I had some comments 
on this in https://github.com/apple/swift-evolution/pull/437 
<https://github.com/apple/swift-evolution/pull/437>.) Jordan raised the 
objection that when using withUnsafePointer with a global, there is an 
expectation that you’ll get the same address every time. Removing inout would 
cause the argument to be passed by value and the address would refer to a copy. 
Dmitri agreed that this could be a problem. On the other hand, if you don’t 
care about the address, or if you’re not using a value type, it would indeed be 
convenient to have a version of withUnsafePointer that does not require an 
inout argument.

Option 1: Keep inout (not addressing SR-1956). In this case, there’s no reason 
to have both withUnsafePointer and withUnsafeMutablePointer. If you want to 
call a function that expects an UnsafePointer, you can give it an 
UnsafeMutablePointer and there will be an implicit conversion to make it work. 
I discussed this with Apple’s stdlib team and they recommended that if we have 
only one function we use the shorter name “withUnsafePointer” and have it use 
an UnsafeMutablePointer.

Option 2: Fix SR-1956 and have two functions, one with inout and the other not. 
This would address the inconvenience of not being able to use withUnsafePointer 
with immutable values, while still supporting the existing behavior. The 
question then would be what to call these two functions.

- Option 2a. Combine the two existing functions as in Option 1 and use a new 
name for the non-inout version, e.g., withUnsafePointer(toCopyOf:), so that it 
won’t be confused with the old function. (That particular name doesn’t work 
very well when dealing with references to objects, since the object itself 
would not be copied. I haven’t yet come up with a better name, though.) One 
advantage of this approach is that we would not need to rush the new function 
into Swift 3 since it would be an additive change.

- Option 2b. Switch to use withUnsafeMutablePointer for all the cases where you 
care about the getting the same address. Change withUnsafePointer to be the 
non-inout version. Charlie suggested that we could have the migrator convert 
all existing uses on withUnsafePointer in Swift 2 code to use 
withUnsafeMutablePointer in Swift 3, but I’m not sure how well that would work.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to