问题
I\'m slicing an array of strings and setting that to a [String]
variable, but the type checker is complaining. Is it a possible compiler bug?
var tags = [\"this\", \"is\", \"cool\"]
tags[1..<3]
var someTags: [String] = tags[1..<3]
回答1:
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)
回答2:
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
回答3:
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"]
回答4:
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"]
回答5:
Another convenient way to convert an ArraySlice
to Array
is this:
var tags = ["this", "is", "cool"]
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.
回答6:
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])
来源:https://stackoverflow.com/questions/25714673/in-swift-array-string-slicing-return-type-doesnt-seem-to-be-string