var mentions = ["@alex", "@jason", "@jessica", "@john"]
我想将我的数组限制为3个项目,所以我想拼接它:
var slice = [String]()
if mentions.count > 3 {
slice = mentions[0...3] //alex, jason, jessica
} else {
slice = mentions
}
但是,我得到了:
带有基类型'[String]'和索引类型'Range'
的不明确的下标
Apple Swift 2.2版(swiftlang-703.0.18.8 clang-703.0.31) 目标:x86_64-apple-macosx10.9
答案 0 :(得分:24)
问题是mentions[0...3]
会返回ArraySlice<String>
,而不是Array<String>
。因此,您可以先使用Array(_:)
初始化程序将切片转换为数组:
let first3Elements : [String] // An Array of up to the first 3 elements.
if mentions.count >= 3 {
first3Elements = Array(mentions[0 ..< 3])
} else {
first3Elements = mentions
}
或者如果你想使用ArraySlice
(它们对中间计算有用,因为它们在原始数组上提供了一个视图,但不是为长期存储而设计的),您可以使用mentions
中的所有索引下标else
:
let slice : ArraySlice<String> // An ArraySlice of up to the first 3 elements
if mentions.count >= 3 {
slice = mentions[0 ..< 3]
} else {
slice = mentions[mentions.indices] // in Swift 4: slice = mentions[...]
}
虽然到目前为止最简单的解决方案只是使用prefix(_:)
方法,如果n超过数组计数,它将返回前n个元素的ArraySlice
或整个数组的切片:
let slice = mentions.prefix(3) // ArraySlice of up to the first 3 elements
答案 1 :(得分:2)
你可以试试.prefix()。 返回一个子序列,最多达到指定的最大长度,包含集合的初始元素。 如果最大长度超过集合中的元素数,则结果包含集合中的所有元素。
let numbers = [1, 2, 3, 4, 5]
print(numbers.prefix(2)) // Prints "[1, 2]"
print(numbers.prefix(10)) // Prints "[1, 2, 3, 4, 5]"
答案 2 :(得分:1)
还可以查看dropLast()函数:
var mentions:[String] = ["@alex", "@jason", "@jessica", "@john"]
var slice:[String] = mentions
if mentions.count > 3 {
slice = Array(mentions.dropLast(mentions.count - 3))
}
//print(slice) => ["@alex", "@jason", "@jessica"]
答案 3 :(得分:0)
我们可以这样做,
let arr = [10,20,30,40,50]
let slicedArray = arr[1...3]
如果要将切片数组转换为普通数组,
let arrayOfInts = Array(slicedArray)