Answers:
这对我有用:
var test = [1, 2, 3]
var n = 2
var test2 = test[0..<n]
您的问题可能与如何声明数组开始有关。
编辑:
要修复您的功能,您必须将自己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]
Slice
一种Array
,而是从创造一片新的数组。强制转换将使用as
运算符:numbers as Array
这将导致错误。
..
变为..<
; 三个点(省略号)保持不变。不过,谢谢您的提醒;我更新了答案。
Array
在范围内使用下标使用Swift 5,当您编写时…
let newNumbers = numbers[0...position]
…… newNumbers
不是类型,Array<Int>
而是类型ArraySlice<Int>
。根据Apple 的说法,这是因为Array
的subscript(_:)
返回了一个ArraySlice<Element>
,从而给出了一些较大阵列的存储视图。
此外,Swift还提供了Array
一个名为的初始化程序init(_:)
,该初始化程序允许我们从sequence
(包括ArraySlice
)创建一个新数组。
因此,可以使用subscript(_:)
with init(_:)
来从数组的前n个元素中获取新数组:
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]
Array
的prefix(_:)
方法Swift为prefix(_:)
符合Collection
协议(包括Array
)的类型提供了一种方法。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]
使用extension
和参数名称的另一种变体range
此扩展程序使用Range
和ClosedRange
extension Array {
subscript (range r: Range<Int>) -> Array {
return Array(self[r])
}
subscript (range r: ClosedRange<Int>) -> Array {
return Array(self[r])
}
}
测试:
func testArraySubscriptRange() {
//given
let arr = ["1", "2", "3"]
//when
let result = arr[range: 1..<arr.count] as Array
//then
XCTAssertEqual(["2", "3"], result)
}
func testArraySubscriptClosedRange() {
//given
let arr = ["1", "2", "3"]
//when
let result = arr[range: 1...arr.count - 1] as Array
//then
XCTAssertEqual(["2", "3"], result)
}