Добавить элемент в массив в Swift


340

Предположим, у меня есть массив, например:

var myArray = ["Steve", "Bill", "Linus", "Bret"]

А позже я хочу нажать / добавить элемент в конец указанного массива, чтобы получить:

["Steve", "Bill", "Linus", "Bret", "Tim"]

Какой метод я должен использовать?

А как насчет случая , когда я хочу , чтобы добавить элемент в передней части массива? Есть ли постоянное время без смещения?


95
Стив Джобс, Билл Гейтс, Линус Торвальдс, но кто такой Брет? - Я чувствую, что должен знать (и я, вероятно, собираюсь пнуть себя, когда узнаю!)
Джиммери

23
Брет Виктор? wordream.com
onekiloparsec

19
Брет Виктор прав. Говорят, что его работа вдохновляла
Свифта

3
Принимая во внимание, вы никогда не сможете использовать индекс для добавления элемента в новый индекс. подписка используется только для обновления значения или чтения из существующего индекса. Так что, если у вас есть, let array = [Int]()вы никогда не сможете сказать, что array[0] = 42он выдаст ошибку индекса вне диапазона . Вы должны использовать array.append(42). Почему ты не можешь подписаться? По той же причине вы не можете сделать letters[3] = dдля let letters = [a,b,c]. Третий индекс не существует, как массив [0] перед значением!
Мед

4
Не учите его, как это сделать. Тим не должен быть допущен в этот массив, это оскорбление для других ....
Otziii

Ответы:


604

По состоянию на Swift 3/4/5 это делается следующим образом.

Чтобы добавить новый элемент в конец массива.

anArray.append("This String")

Чтобы добавить другой массив в конец вашего массива.

anArray += ["Moar", "Strings"]
anArray.append(contentsOf: ["Moar", "Strings"])

Чтобы вставить новый элемент в ваш массив.

anArray.insert("This String", at: 0)

Чтобы вставить содержимое другого массива в ваш массив.

anArray.insert(contentsOf: ["Moar", "Strings"], at: 0)

Дополнительную информацию можно найти в главе «Типы коллекций» « Язык программирования Swift », начиная со стр. 110.


2
Отличный ответ. Несоответствие в том, как Apple реализовала это, вызывает раздражение. Предположительно, anArray + = "Foo" делает то же самое, что anArray + = ["Foo"] Лично я буду использовать последний синтаксис, чтобы не запутаться.
original_username

11
anArray + = "Foo" больше не работает из xCode 6 beta 5
Amitay

Можете ли вы сделать список методов и функций для создания и заполнения массива тоже ?? : D

1
Это терпит неудачу во время выполнения. В массиве уже есть элементы, которые я пытаюсь вставить, так что это не так. Мой обходной путь - создать новый массив с элементом, который я пытаюсь вставить, а затем добавить все элементы из исходного массива. Уверен, что это является результатом проблемы сохранения в другом месте - каким-то образом эти объекты хороши, если они остаются в исходных точках массива, но если iOS пытается переместить их (в результате вставки), происходит сбой. Или это какая-то странная проблема Swift / IB.
MusiGenesis

1
spliceпереименуйте insertContentsOfв Swift 2.
Алмас Сапаргали

21

Вы также можете передать переменную и / или объект, если хотите.

var str1:String = "John"
var str2:String = "Bob"

var myArray = ["Steve", "Bill", "Linus", "Bret"]

//add to the end of the array with append
myArray.append(str1)
myArray.append(str2)

Чтобы добавить их на фронт:

//use 'insert' instead of append
myArray.insert(str1, atIndex:0)
myArray.insert(str2, atIndex:0)

//Swift 3
myArray.insert(str1, at: 0)
myArray.insert(str2, at: 0)

Как уже говорили другие, вы больше не можете использовать '+ =' с xCode 6.1


2
Имеет смысл, с отсутствием .prepend()функции, вставка в голову, кажется, хороший подход
Аттикус

1
Совершенно очевидно, что вы все еще можете использовать + =, но не для одного элемента.
Лео Дабус

17

Чтобы добавить в конец, используйте +=оператор:

myArray += ["Craig"]
myArray += ["Jony", "Eddy"]

Этот оператор обычно эквивалентен append(contentsOf:)методу. (И в действительно старых версиях Swift можно добавлять отдельные элементы, а не только другие коллекции одного и того же типа элемента.)

Там также insert(_:at:)для вставки в любой индекс.

Если, скажем, вам нужна удобная функция для вставки в начале, вы можете добавить ее в Arrayкласс с расширением .


Если myArrayимеет тип Array, то первая строка неверна. +=Оператор может быть использован только если оба myArrayи правый операнд типа Array.
Барт Джейкобс

1
Это было правильно, когда я отправил этот ответ, но с тех пор язык изменился. Ответ обновлен.
Рикстер

Сказать , что +=и appendэквивалентны не является правильным, бывший предполагает создание временного массива , который будет отброшен , как только оператор - функция потребляет его.
Cristik

10

Используйте операторы + = и +:

extension Array {

}

func += <V> (inout left: [V], right: V) {
    left.append(right)
}

func + <V>(left: Array<V>, right: V) -> Array<V>
{
    var map = Array<V>()
    for (v) in left {
        map.append(v)
    }

    map.append(right)

    return map
}

затем используйте:

var list = [AnyObject]()
list += "hello" 
list += ["hello", "world!"]
var list2 = list + "anything"

Во второй функции нет необходимости перебирать левый массив. Делать, var copy = leftа затем добавлять copy.append(right)достаточно. В Swift массивы являются типами значений, а не ссылочными типами.
Натан Р.

4

Вот небольшое расширение, если вы хотите вставить в начало массива, не теряя элемент в первой позиции

extension Array{
    mutating func appendAtBeginning(newItem : Element){
        let copy = self
        self = []
        self.append(newItem)
        self.appendContentsOf(copy)
    }
}

Ошибка: значение типа 'Array <Element>' не имеет члена 'appendContentsOf'
Дани Кемпер

3

В Swift 4.1 и Xcode 9.4.1

Мы можем добавить объекты в массив в основном двумя способами

let stringOne = "One"
let strigTwo = "Two"
let stringThree = "Three"
var array:[String] = []//If your array is string type

Тип 1)

//To append elements at the end
array.append(stringOne)
array.append(stringThree)

Тип 2)

//To add elements at specific index
array.insert(strigTwo, at: 1)

Если вы хотите добавить два массива

var array1 = [1,2,3,4,5]
let array2 = [6,7,8,9]

let array3 = array1+array2
print(array3)
array1.append(contentsOf: array2)
print(array1)

2

Со страницы 143 языка программирования Swift:

Вы можете добавить новый элемент в конец массива, вызвав метод добавления массива

Либо добавьте новый элемент в конец массива с помощью оператора присваивания (+ =)

Выдержка из: Apple Inc. «Язык программирования Swift». интерактивные книги. https://itun.es/us/jEUH0.l


2

Чтобы добавить к предлагаемым решениямappend , полезно знать, что во многих случаях это амортизированная операция с постоянным временем :

Сложность: Амортизированная O (1), если память себя не используется совместно с другим живым массивом; O (считать), если self не оборачивает мост NSArray; в противном случае эффективность не указана.

Я ищу consоператора как Swift. Он должен возвращать новый неизменный массив с прикрепленным элементом в конце, в постоянное время, без изменения исходного массива. Я еще не нашел стандартную функцию, которая делает это. Я постараюсь не забыть сообщить, если я найду один!



1

Если вы хотите добавить уникальный объект, вы можете развернуть структуру Array

extension Array where Element: Equatable {
    mutating func appendUniqueObject(object: Generator.Element) {
        if contains(object) == false {
            append(object)
        }
    }
}

1

Если массив NSArray, вы можете использовать addingфункцию для добавления любого объекта в конец массива, например так:

Swift 4.2

var myArray: NSArray = []
let firstElement: String = "First element"
let secondElement: String = "Second element"

// Process to add the elements to the array
myArray.adding(firstElement)
myArray.adding(secondElement)

Результат :

print(myArray) 
// ["First element", "Second element"]

Это очень простой способ, с уважением!


1

В Swift 4.2: вы можете использовать

myArray.append("Tim") //To add "Tim" into array

или

myArray.insert("Tim", at: 0) //Change 0 with specific location 

0

Пример: student = ["Ben", "Ivy", "Jordell"]

1) Чтобы добавить отдельные элементы в конец массива, используйте append (_ :)

students.append(\ "Maxime" )

2) Добавить несколько элементов одновременно, передав другой массив или последовательность любого вида в метод append (contentsOf :)

students.append(contentsOf: ["Shakia" , "William"])

3) Добавить новые элементы в середину массива, используя метод insert (_: at :) для отдельных элементов

students.insert("Liam" , at:2 )

4) Использование insert (contentsOf: at :) для вставки нескольких элементов из другой коллекции или литерала массива

students.insert(['Tim','TIM' at: 2 )

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.