In Swift, Array [String] slicing return type doesn't seem to be [String]
IosSwiftSub ArrayIos Problem Overview
Ios Solutions
Solution 1 - Ios
Subscripting an array with a range doesn't return an array, but a slice. You can create an array out of that slice though.
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
Solution 2 - Ios
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
Solution 3 - Ios
You can also do this to get a new array of the slice:
var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0]) //prints ["is", "cool"]
Solution 4 - Ios
Another way to do that in one place is combine variable declaration let someTags: [String]
and map(_:)
, that will transform ArraySlice<String>
to [String]
:
let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
Solution 5 - Ios
Another convenient way to convert an ArraySlice
to Array
is this:
var someTags: [String] = tags[1..<3] + []
It's not perfect because another developer (or yourself) who looks at it later may not understand its purpose. The good news is that if that developer (maybe you) removes the + []
they will immediately be met with a compiler error, which will hopefully clarify its purpose.
Solution 6 - Ios
Just cast the slice as an Array when it's created. Keeping your Array as an array without having to use an intermediate variable. This works great when using Codable types.
var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])