如何在Swift中执行数组切片?

时间:2016-08-05 20:57:39

标签: ios swift

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

4 个答案:

答案 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)