Новый массив из диапазона индексов Swift
как я могу сделать что-то подобное? Взять первые n элементов из массива:
newNumbers = numbers[0..n]
В настоящее время появляется следующая ошибка:
error: could not find an overload for 'subscript' that accepts the supplied arguments
EDIT:
вот функция, в которой я работаю.
func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
var newNumbers = numbers[0...position]
return newNumbers
}
3 ответов:
это работает для меня:
var test = [1, 2, 3] var n = 2 var test2 = test[0..<n]ваша проблема может быть с тем, как вы объявляете свой массив для начала.
EDIT:
чтобы исправить свою функцию, вы должны бросить свой
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>но это типаArraySlice<Int>. Это потому чтоArray' ssubscript(_:)возвращаетArraySlice<Element>это, согласно Apple, представляет собой представление о хранении некоторого большего массива.кроме того, Swift также предоставляет
init(_:)инициализатор дляArrayчто позволяет нам создать новый массив изsequence(включаяArraySlice).таким образом, вы можете использовать один из следующих четырех способы получения нового массива из первого 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' sprefix(_:)методSwift обеспечивает
prefix(_:)способ для типов что соответствуетCollectionпротокол (в том числеArray).prefix(_:)есть следующее объявление:func prefix(_ maxLength: Int) -> ArraySlice<Element>возвращает подпоследовательность длиной до 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]
#3. Создание пользовательской глобальной функции
следующий код игровой площадки показывает ho для создания глобальной функции, которая возвращает первый n элементов
Array: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. Создание
Arrayпользовательский модуль методследующий код игровой площадки показывает ho для создания
Arrayрасширение пользовательского метода, который возвращает первый n элементыArray: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)]) }
Comments