在 Swift 中,Array [ String ]切片返回类型似乎不是[ String ]

我正在对字符串数组进行切片并将其设置为 [String]变量,但类型检查器在抱怨。可能是编译器的错误吗?

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]

screenshot

35400 次浏览

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)

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"]
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"

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"]

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.

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])