[swift-users] Range subscript is ambiguous

Joe Groff jgroff at apple.com
Mon May 16 12:09:40 CDT 2016


> On May 15, 2016, at 5:31 AM, Neil Faiman via swift-users <swift-users at swift.org> wrote:
> 
> This function seems simple enough:
> 
> 
>    func foo(a: [Int], n: Int) {
>        var x : [Int] = a[0..<n]
>    }
> 
> But it doesn’t compile.
> 
>    error: ambiguous subscript with base type '[Int]' and index type 'Range<Int>'
>    var x : [Int] = a[0..<n]
>        ~^~~~~~~
>        Swift.Array:100:12: note: found this candidate
>    public subscript (subRange: Range<Int>) -> ArraySlice<Element> { get set }
>    ^
>    Swift.MutableCollectionType:3:12: note: found this candidate
>    public subscript (bounds: Range<Self.Index>) -> MutableSlice<Self> { get set }
>    ^
>    Swift.CollectionType:2:12: note: found this candidate
>    public subscript (bounds: Range<Self.Index>) -> Slice<Self> { get }
>    ^
> 
> The oddity is that if I change the assignment to this
> 
>    var y : [Int] = Array(a[0..<n])
> 
> then the compiler is happy.
> 
> Shouldn’t it be able to do any necessary type inference from the fact that the expression is in a context where an array is required?

The error message is misleading (if you have time, we'd appreciate a bug report!). What's really going on is that a[0..<n] produces an ArraySlice<T>, not an Array<T>, in order to share memory with the underlying array. The type doesn't match in your assignment. If `x` is just temporary, I'd recommend leaving the type annotation out, since `var x = a[0..<n]` should just work.

-Joe


More information about the swift-users mailing list