在Swift中,数组[String]的切片返回类型似乎不是[String]。

90
我正在对一个字符串数组进行切片,并将其设置为一个[String]变量,但类型检查器报错了。这可能是编译器的bug吗?
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]

screenshot

6个回答

174

使用范围对数组进行下标操作不会返回一个数组,而是一个切片。但您可以通过该切片创建一个数组。

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)

3
你在哪里可以找到有关Slice的文档?此外,错误消息是不正确的,而在playground中,Slice显示为[String]。因此,似乎存在两个编译器错误和缺少文档。 - zaph
1
您可以在此处查看subscript方法的定义:https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/Array.html - Connor
2
我同意错误是不正确的,文档可能需要改进。如果您尝试将其分为两个步骤:var someTags = tags[1..<3] var someTagsArray: [String] = someTags,它会给出更有帮助的错误提示:错误:'Slice<String>'无法转换为'[String]' - Connor
@Zaph 请看这里 Arraysubstring 声明:http://swifter.natecook.com/type/Array/ -- 链接到 Slice: http://swifter.natecook.com/type/Slice/ - Nate Cook
1
使用Swift 3,在第三行出现错误,"Type 'String' does not conform to protocol 'indexable'"。 - RenniePet
显示剩余5条评论

14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"

0

在同一处完成这个操作的另一种方式是将变量声明let someTags: [String]map(_:)结合起来,这将把ArraySlice<String>转化为[String]

let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]

0

你还可以这样做,以获得切片的新数组:

var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0])  //prints ["is", "cool"]

没问题,但有点令人困惑。 - DawnSong
我预期它会打印 "is" - Yitzchak

0

ArraySlice 转换为 Array 的另一种方便方法是:

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

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


0
只需在创建时将切片转换为数组即可。保持您的数组作为数组,而无需使用中间变量。当使用可编码类型时,这非常有效。
var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接