> On May 15, 2016, at 5:31 AM, Neil Faiman via swift-users > <swift-users@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 _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users