Yes, the idea was to key off of an optional index. something like this:

> extension Array {
>     public subscript(_ index: Int?) -> Element? {
>         guard let i = index, i < endIndex else { return nil }
>         
>         return self[i]
>     }
> }
> 
> let array = ["foo", "bar", "baz"]
> 
> array[1] // "bar"
> 
> let index: Int? = 5
> let notInArray = array[index]

This doesn’t work today with the error “ambiguous use of 'subscript’” on 
“self[i]” but surely that could be fixed.


Jeff Kelley

slauncha...@gmail.com | @SlaunchaMan <https://twitter.com/SlaunchaMan> | 
jeffkelley.org <http://jeffkelley.org/>
> On Apr 13, 2017, at 12:18 PM, David Sweeris <daveswee...@mac.com> wrote:
> 
> 
>> On Apr 13, 2017, at 08:53, Josh Parmenter <jparmen...@vectorform.com> wrote:
>> 
>> This seems inconsistent to me. 2 is 2... 2 itself is not optional. You 
>> wouldn't expect 2 to be unwrapped.
> 
> Correct. I think the idea was that "2?" would get converted to an 
> `Optional<Int>`, which would then call a subscript that took an `Index?` 
> instead of `Index`. The trailing "?" doesn't do that, but for some reason I 
> thought it might.
> 
> IMHO, the semantics are clear(ish) in context, but it feels slightly odd for 
> "?" to have two opposite behaviors depending on whether the argument is or 
> isn't an Optional.
> 
> In any case, given that we're discussing a "safe subscript", we need a way to 
> differentiate the safe subscript from the unsafe subscript. The only two ways 
> to do that are to either add an argument label or change the argument type, 
> and IMHO the best alternate argument type is `Index?`, since it's pretty 
> light-weight, already part of the stdlib, and already familiar to Swift 
> developers.
> 
> Someone already said it was a bad idea, though, so I'm rethinking my support.
> 
> - Dave Sweeris 
> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to