88

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

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

截屏

4

6 回答 6

170

使用范围下标数组不会返回数组,而是返回切片。不过,您可以从该切片中创建一个数组。

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
于 2014-09-07T20:58:48.037 回答
14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
于 2014-09-07T22:07:18.130 回答
0

您也可以这样做来获取切片的新数组:

var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0])  //prints ["is", "cool"]
于 2014-09-07T21:13:50.090 回答
0

只需在创建切片时将其转换为数组。将您的 Array 保留为数组,而无需使用中间变量。这在使用 Codable 类型时非常有用。

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
于 2019-10-12T01:16:22.040 回答
0

另一种转换为的便捷方法ArraySliceArray

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

它并不完美,因为稍后查看它的其他开发人员(或您自己)可能不理解它的目的。好消息是,如果该开发人员(也许是您)删除了它们,+ []他们将立即遇到编译器错误,这有望阐明其目的。

于 2018-10-16T22:32:48.223 回答
0

在一个地方做到这一点的另一种方法是结合变量声明let someTags: [String]map(_:),这将转换ArraySlice<String>[String]

let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
于 2018-04-21T11:29:28.870 回答