索引范围Swift中的新数组

Cha*_*gan 109 arrays swift

我怎么能这样做?从数组中取出前n个元素:

newNumbers = numbers[0..n]
Run Code Online (Sandbox Code Playgroud)

目前收到以下错误:

error: could not find an overload for 'subscript' that accepts the supplied arguments
Run Code Online (Sandbox Code Playgroud)

编辑:

这是我正在工作的功能.

func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
    var newNumbers = numbers[0...position]
    return newNumbers
}
Run Code Online (Sandbox Code Playgroud)

Cez*_*cik 164

这对我有用:

var test = [1, 2, 3]
var n = 2
var test2 = test[0..<n]
Run Code Online (Sandbox Code Playgroud)

您的问题可能与您开始声明阵列的方式有关.

编辑:

要修复您的功能,您必须将您Slice转换为数组:

func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
    var newNumbers = Array(numbers[0..<position])
    return newNumbers
}

// test
aFunction([1, 2, 3], 2) // returns [1, 2]
Run Code Online (Sandbox Code Playgroud)

  • 迂腐一点,但这并不是真正*将'Slice`转换为`Array`,而是从切片创建一个新数组.演员使用`as`运算符:`numbers as Array`会导致错误. (20认同)
  • 迷人的!干杯 - 有效。当答案允许时我会接受。 (2认同)
  • 两个点'..'改为`.. <`; 三个点(省略号)保持不变.谢谢你的提醒; 我更新了答案. (2认同)

Ima*_*tit 87

使用Swift 4,当你写:

let newNumbers = numbers[0...position]
Run Code Online (Sandbox Code Playgroud)

Array不是类型,newNumbers而是类型Array<Int>.这是因为ArraySlice<Int>Array返回subscript(_:?),根据苹果,呈现视图到一些较大的阵列的存储.

此外,Swift还提供了一个ArraySlice<Element>初始化器Array,允许我们从init(_:?)(包括sequence)创建一个新的数组.

因此,您可以使用以下四种方法之一来获取数组前n个元素的新数组.


#1.使用ArraySlice带有范围的下标

您可以使用subscript(_:?)标有init(_:?),Array,prefix(_:)prefix(_:)为了得到一个数组的第一个元素的序列.

用法:

let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array[0..<3] // using Range
//let arraySlice = array[0...2] // using ClosedRange also works
//let arraySlice = array[..<3] // using PartialRangeUpTo also works
//let arraySlice = array[...2] // using PartialRangeThrough also works
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]
Run Code Online (Sandbox Code Playgroud)

#2.使用CollectionArray方法

Swift为prefix(_:)符合Array协议(包括newNumbers)的类型提供了一种方法.Array<Int>有以下声明:

func prefix(_ maxLength: Int) -> ArraySlice<Element>
Run Code Online (Sandbox Code Playgroud)

返回一个子序列,最长为maxLength,包含初始元素.

Apple还声明:

如果最大长度超过集合中的元素数,则结果将包含集合中的所有元素.

用法:

let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array.prefix(3)
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]
Run Code Online (Sandbox Code Playgroud)

#3.创建自定义全局函数

以下Playground代码显示为创建一个返回前n个元素的全局函数ArraySlice<Int>:

let newNumbers = numbers[0...position]
Run Code Online (Sandbox Code Playgroud)

#4.创建Array扩展自定义方法

以下Playground代码显示ho以创建subscript(_:?)扩展自定义方法,该方法返回以下的前n个元素ArraySlice<Element>:

let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array[0..<3] // using Range
//let arraySlice = array[0...2] // using ClosedRange also works
//let arraySlice = array[..<3] // using PartialRangeUpTo also works
//let arraySlice = array[...2] // using PartialRangeThrough also works
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]
Run Code Online (Sandbox Code Playgroud)

  • 为了完整起见,“Array”还有一个“suffix”方法,其工作方式类似于此处显示的“prefix”方法。 (4认同)

Phi*_*hil 5

func subArray<T>(array: [T], range: NSRange) -> [T] {
  if range.location > array.count {
    return []
  }
  return Array(array[range.location..<min(range.length, array.count)])
}
Run Code Online (Sandbox Code Playgroud)