【问题标题】:How can I perform an Array Slice in Swift?如何在 Swift 中执行数组切片?
【发布时间】:2016-08-05 20:57:39
【问题描述】:
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

【问题讨论】:

  • 你可以做let slice = mentions.prefix(3)
  • 谢谢。但是作为参考,如果我不想从 0 开始前缀,你能告诉我该怎么做吗?

标签: ios swift


【解决方案1】:

问题是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 个元素的 ArraySlice,如果 n 超过数组计数,则返回整个数组的切片:

let slice = mentions.prefix(3) // ArraySlice of up to the first 3 elements

【讨论】:

  • 您提供的第一个解决方案不起作用。它仍然返回所有 4 个名称。
  • @TIMEX 这就是您的原始代码所做的,因为您的索引从 0 到包括 3,因此有 4 个项目 - 如果您想要第一个,可以使用范围 0..&lt;3 3(当然还要更改计数检查)。我已经更新了我的答案,显示了这一点。
【解决方案2】:

我们可以这样做,

let arr = [10,20,30,40,50]
let slicedArray = arr[1...3]

如果要将切片数组转换为普通数组,

let arrayOfInts = Array(slicedArray)

【讨论】:

    【解决方案3】:

    你可以试试 .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]"
    

    【讨论】:

      【解决方案4】:

      也可以看看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"]
      

      【讨论】:

        【解决方案5】:

        一般解决方案:

        extension Array {
           func slice(size: Int) -> [[Element]] {
              (0...(count / size)).map{Array(self[($0 * size)..<(Swift.min($0 * size + size, count))])}
           }
        }
        

        【讨论】:

        • 这是我需要的,谢谢
        猜你喜欢
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-19
        • 2012-11-10
        相关资源
        最近更新 更多