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


87

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

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

屏幕截图

Answers:


169

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

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

3
您在哪里找到Slice记录?错误消息也不正确,并且Slice在操场上显示为[String]。因此,似乎有两个编译器错误和缺少文档。
zaph 2014年

1
你可以在这里看到subscipt方法的定义:developer.apple.com/library/prerelease/ios/documentation/...
康纳

2
我同意该错误是不正确的,文档可能需要一些工作。如果分两步进行尝试:var someTags = tags[1..<3] var someTagsArray: [String] = someTags它会为您提供更多帮助error: 'Slice<String>' is not convertible to '[String]'
Connor 2014年

我的错,我看着Swift iBooks。我认为Apple应该删除它们,以使其保持最新状态。
zaph 2014年

1
使用Swift 3,第三行出现错误,“类型'String'不符合协议'indexable'”。
RenniePet '16

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

0

您还可以执行以下操作以获取切片的新数组:

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

可以,但是令人困惑。
DawnSong

我希望它会打印“是”
Yitzchak

0

在同一位置执行此操作的另一种方法是将变量声明let someTags: [String]和组合在一起map(_:),它将转换ArraySlice<String>[String]

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

0

转换的另一种便捷的方式ArraySliceArray是这样的:

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

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


0

创建切片时,只需将其转换为数组即可。将数组保持为数组,而不必使用中间变量。使用Codable类型时,这非常有用。

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.