【发布时间】:2017-06-01 11:49:52
【问题描述】:
我正在对字符串数组进行切片并将其设置为 [String] 变量,但类型检查器正在抱怨。这可能是编译器错误吗?
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]
【问题讨论】:
我正在对字符串数组进行切片并将其设置为 [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)
【讨论】:
Slice 的文档?此外,错误消息不正确,Slice 在操场上显示为 [String]。因此,似乎有两个编译器错误和缺少文档。
var someTags = tags[1..<3] var someTagsArray: [String] = someTags 它会给您更多帮助error: 'Slice<String>' is not convertible to '[String]'
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"]
【讨论】:
在一个地方执行此操作的另一种方法是组合变量声明 let someTags: [String] 和 map(_:),这会将 ArraySlice<String> 转换为 [String]:
let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
【讨论】:
另一种将ArraySlice 转换为Array 的便捷方法是:
var tags = ["this", "is", "cool"]
var someTags: [String] = tags[1..<3] + []
它并不完美,因为稍后查看它的其他开发人员(或您自己)可能不理解它的用途。好消息是,如果该开发人员(也许是您)删除了+ [],他们将立即遇到编译器错误,这有望阐明其目的。
【讨论】:
只需在创建切片时将其转换为数组即可。将您的 Array 保留为数组,而无需使用中间变量。这在使用 Codable 类型时非常有用。
var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
【讨论】: