来自索引范围Swift的新数组

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

newNumbers = numbers[0..n] 

目前得到以下错误:

 error: could not find an overload for 'subscript' that accepts the supplied arguments 

编辑:

这是我正在工作的function。

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

这适用于我:

 var test = [1, 2, 3] var n = 2 var test2 = test[0..<n] 

你的问题可能是你如何声明你的数组开始。

编辑:

要修复你的function,你必须把你的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] 

用Swift 4,当你写:

 let newNumbers = numbers[0...position] 

newNumbers不是Array<Int>types, ArraySlice<Int>types。 这是因为Arraysubscript(_:​) ArraySlice<Element>返回一个ArraySlice<Element> ,根据Apple的说法,这个ArraySlice<Element>提供了一个更大的数组存储的视图。

此外,Swift还为Array提供了一个init(_:​) ArraySlice初始值设定项,允许我们从一个sequence (包括ArraySlice )创build一个新的数组。

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


#1。 使用范围的Array下标

您可以使用Array下标与CountableRangeCountableClosedRangePartialRangeUpTopartialRangeThrough为了获得一个数组的第一个元素的子序列。

用法:

 let array = Array(10...14) // [10, 11, 12, 13, 14] let arraySlice = array[..<3] // using PartialRangeUpTo //let arraySlice = array[...2] // using PartialRangeThrough //let arraySlice = array[0..<3] // using CountableRange //let arraySlice = array[0...2] // using CountableClosedRange let newArray = Array(arraySlice) print(newArray) // prints [10, 11, 12] 

#2。 使用Arrayprefix(_:)方法

Swift为符合Collection协议(包括Array )的types提供了prefix(_:)方法。 prefix(_:)具有以下声明:

 func prefix(_ maxLength: Int) -> ArraySlice<Element> 

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

苹果还表示:

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

用法:

 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] 

#3。 创build一个自定义的全局函数

下面的Playground代码展示了如何创build一个返回Array的前n个元素的全局函数:

 func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> { let newNumbers = numbers[0 ..< position] return Array(newNumbers) } let array = Array(10...14) // [10, 11, 12, 13, 14] let newArray = aFunction(numbers: array, position: 3) print(newArray) // prints [10, 11, 12] 

#4。 创build一个Array扩展自定义方法

下面的Playground代码展示了如何创build一个Array扩展自定义方法,该方法返回一个Array的前n个元素:

 extension Array { func getFirstElements(upTo position: Int) -> Array<Element> { let arraySlice = self[0 ..< position] return Array(arraySlice) } } let array = Array(10...14) // [10, 11, 12, 13, 14] let newArray = array.getFirstElements(upTo: 3) print(newArray) // prints [10, 11, 12] 
 func subArray<T>(array: [T], range: NSRange) -> [T] { if range.location > array.count { return [] } return Array(array[range.location..<min(range.length, array.count)]) }