[swift-evolution] Arrays Returning Optionals instead of Index Out of Bounds

Vladimir.S svabox at gmail.com
Tue Jun 7 06:48:21 CDT 2016

On 06.06.2016 21:02, Rob Norback wrote:
> First of all, thank you all for bringing me up to date so quickly.  I
> looked over the proposal and it looks awesome.
> But as Chris mentioned, this doesn't solve the expected behavior and
> ambiguity of ```Array<Int?>```
> In this case I would expect the default behavior (myArray[4]) without using
> myArray[checking: 4] should return a nil in this case.

As Luis already noted, there was a discussion started with exactly the same 
suggestion : return optional for wrong index/range. During the discussion 
consensus was(I believe so) found that such proposal could not be 
supported. But, as an alternative, special explicit syntax for 
optional/checking results for index/range parameter was suggested. I'd 
recommend to read messages of these discussions.

As for [Int?], I believe we need no any additional solution for this 
special case: you have to check if index is in array's bounds and if it is, 
get value using standard subscript method.

> And Chris, I think it would make the most sense to have myArray[0] = nil to
> be stored if the index is in Range, and for myArray[100] = nil to give a
> warning of no assignment being made because index is out of range, kind of
> like an unused variable.  Right now myArray[100] = nil gives you
> EXC_BAD_INSTRUCTION.  Then if you assigned myArray[100] = 200, that would
> have to simply change the Range.
> Chris, I honestly have to think more about that ambiguity with dictionaries.
> I can see that this would definitely need some further fleshing out, but it
> seems to be sufficiently different from Luis' proposal to perhaps merit
> it's own proposal.
> It's up to you Luis, but I think this might be a bit more controversial
> then the changes you've proposed, making it possible for your proposal
> getting rejected.  (I want your proposal accepted, since I would use those
> features today).  Partial acceptance of a proposal doesn't seem to be a
> thing. (Once again please correct me if I'm wrong).
> On Mon, Jun 6, 2016 at 11:46 AM Luis Henrique B. Sousa <lshsousa at gmail.com
> <mailto:lshsousa at gmail.com>> wrote:
>     Thanks Vladimir,
>     The correct link is this one (with the additional min/max operations in
>     the implementation):
>     https://github.com/luish/swift-evolution/blob/proposal-lenient-collection-subscripts/proposals/nnnn-more-lenient-collections-subscripts.md
>     Here is the pull request on the swift-evolution
>     repo: https://github.com/apple/swift-evolution/pull/328
>     Any help or suggestion to improve the proposal is welcome. :-)
>     - Luis
>     On Mon, Jun 6, 2016 at 6:10 PM, Vladimir.S via swift-evolution
>     <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>         Please find this draft of proposal(hope this is correct link for
>         latest version):
>         https://github.com/luish/swift-evolution/blob/more-lenient-subscripts/proposals/nnnn-more-lenient-collections-subscripts.md
>         The main idea is to introduce 2 new subscript methods:  [clamping:]
>         and [checking:]
>         There was discussion in "[Proposal] More lenient subscript methods
>         over Collections" and (older) "[Proposal] Safer half-open range
>         operator"
>         On 06.06.2016 19:50, Rob Norback via swift-evolution wrote:
>             Hi Everyone!
>             This is my first time emailing the swift evolution list, so if
>             this topic
>             has already been discussed please let me know.  I looked
>             through all the
>             accepted and rejected proposals and it doesn't seem to be on there.
>             The main thought is that dictionaries return optionals, so why
>             not arrays?
>             Or other CollectionTypes for that matter.  I would think this
>             would be the
>             expected behavior in this situation:
>             var myArray:[String?] = []
>             print(myArray[4])
>             // EXC_BAD_INSTRUCTION, but could just be Optional(nil)
>             Then you could do things like
>             if let arrayValue = myArray[4] {
>                // do something
>             }
>             Of course you could simply check with with the count, but
>             considering
>             Swift's use of optionals to represent empty variables rather
>             than erroring
>             out or returning an empty String, I think this functionality
>             would be
>             appropriate to include in the Swift standard library.
>             And there's about 15,000 people who've looked for this
>             functionality in the
>             last year:
>             http://stackoverflow.com/questions/25329186/safe-bounds-checked-array-lookup-in-swift-through-optional-bindings.
>             Please let me know what you think.
>             Best,
>             Rob Norback
>             _______________________________________________
>             swift-evolution mailing list
>             swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>             https://lists.swift.org/mailman/listinfo/swift-evolution
>         _______________________________________________
>         swift-evolution mailing list
>         swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>         https://lists.swift.org/mailman/listinfo/swift-evolution

More information about the swift-evolution mailing list