我正在切片一个字符串数组并将其设置为一个[String]
变量,但类型检查器正在抱怨。它是一个可能的编译器错误吗?
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]
使用范围下标数组不会返回数组,而是返回切片。不过,您可以从该切片中创建一个数组。
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
您也可以这样做来获取切片的新数组:
var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0]) //prints ["is", "cool"]
只需在创建切片时将其转换为数组。将您的 Array 保留为数组,而无需使用中间变量。这在使用 Codable 类型时非常有用。
var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
另一种转换为的便捷方法ArraySlice
是Array
:
var tags = ["this", "is", "cool"]
var someTags: [String] = tags[1..<3] + []
它并不完美,因为稍后查看它的其他开发人员(或您自己)可能不理解它的目的。好消息是,如果该开发人员(也许是您)删除了它们,+ []
他们将立即遇到编译器错误,这有望阐明其目的。
在一个地方做到这一点的另一种方法是结合变量声明let someTags: [String]
和map(_:)
,这将转换ArraySlice<String>
为[String]
:
let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]