来自索引范围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。 这是因为Array
的subscript(_:)
ArraySlice<Element>
返回一个ArraySlice<Element>
,根据Apple的说法,这个ArraySlice<Element>
提供了一个更大的数组存储的视图。
此外,Swift还为Array
提供了一个init(_:)
ArraySlice
初始值设定项,允许我们从一个sequence
(包括ArraySlice
)创build一个新的数组。
因此,可以使用以下四种方法之一来获取数组中前n个元素的新数组。
#1。 使用范围的Array
下标
您可以使用Array
下标与CountableRange
, CountableClosedRange
, PartialRangeUpTo
或partialRangeThrough
为了获得一个数组的第一个元素的子序列。
用法:
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。 使用Array
的prefix(_:)
方法
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)]) }