Додайте елемент до масиву в Swift


340

Припустимо, у мене є масив, наприклад:

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

А пізніше я хочу натиснути / додати елемент до кінця згаданого масиву, щоб отримати:

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

Який метод я повинен використовувати?

А як щодо випадку, коли я хочу додати елемент до передньої частини масиву? Чи є постійний незмінний час?


95
Стів Джобс, Білл Гейтс, Лінус Торвальдс, але хто такий Брет? - Мені здається, що я маю знати (і, мабуть, я
б'ю

23
Брет Віктор? caredream.com
onekiloparsec

19
Брет Віктор прав. Його роботи, як кажуть, були натхненням для частин швидких
Фела Вінкельмолен

3
маючи на увазі, що ви ніколи не можете використовувати індекс, щоб додати елемент до нового індексу. підписка використовується лише для оновлення значення або зчитування з існуючого індексу. Тож якщо у вас є, let array = [Int]()ви ніколи не можете сказати, що array[0] = 42це дасть індекс поза помилкою діапазону . Ви повинні використовувати array.append(42). Чому ви не можете підписатись? З тієї ж причини ви не можете зробити letters[3] = dдля let letters = [a,b,c]. 3-й індекс не існує, як і масив [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)

Додаткову інформацію можна знайти в розділі "Типи колекцій" розділу " Швидка мова програмування ", починаючи зі сторінки 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перейменувати на insertContentsOfSwift 2.
Almas Sapargali

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()функції, введення в голову здається хорошим підходом
Atticus

1
Цілком зрозуміло, що ви все одно можете використовувати + =, але не для одного елемента.
Лев Дабус

17

Щоб додати до кінця, скористайтеся +=оператором:

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

Цей оператор, як правило, еквівалентний append(contentsOf:)методу. (І в дійсно старих версіях Swift можна додавати окремі елементи, а не лише інші колекції одного типу елементів.)

Є також insert(_:at:)можливість вставки в будь-який індекс.

Якщо, скажімо, ви хотіли б функцію зручності для вставки на початку, ви можете додати її до Arrayкласу з розширенням .


Якщо myArrayце тип Array, то перший рядок є неправильним. +=Оператор може бути використаний тільки якщо обидва myArrayі правий операнд типу Array.
Барт Джейкобс

1
Коли я опублікував цю відповідь, це було правильно, але з тих пір мова змінилася. Відповідь оновлено.
рикстер

Якщо сказати, що це +=та appendеквівалент, не є правильним, перший передбачає створення тимчасового масиву, який буде відкинутий, як тільки функція оператора його споживає.
Крістік

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"
Dani Kemper

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 мови програмування The Swift:

Ви можете додати новий елемент до кінця масиву, зателефонувавши до методу додавання масиву

Крім того, додайте новий елемент до кінця масиву за допомогою оператора присвоєння додавання (+ =)

Уривок: Apple Inc. "Мова швидкого програмування". iBooks. https://itun.es/us/jEUH0.l


2

Щоб додати рішення, що підказуютьappend , корисно знати, що це амортизована операція постійного часу у багатьох випадках:

Складність: Амортизований O (1), якщо зберігання власного власного ресурсу не поділяється з іншим живим масивом; O (підрахунок), якщо самостійно не завершує мостовий NSArray; інакше ефективність не визначена.

Я шукаю consподібного оператора Swift. Він повинен повертати новий незмінний масив з елементом, поставленим на кінці, за постійний час, не змінюючи початковий масив. Я ще не знайшов стандартної функції, яка це робить. Я спробую пам'ятати, щоб повідомити про це, якщо знайду його!



1

Якщо ви хочете додати унікальний об'єкт, ви можете розширити структуру масиву

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

1

Якщо масив NSArray, ви можете використовувати addingфункцію для додавання будь-якого об'єкта в кінці масиву, наприклад:

Швидкий 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

Приклад: students = ["Ben", "Ivy", "Jordell"]

1) Щоб додати окремі елементи до кінця масиву, використовуйте додавання (_ :)

students.append(\ "Maxime" )

2) Додайте кілька елементів одночасно, передавши інший масив або послідовність будь-якого типу до додатку (метод contentOf :)

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

3) Додавання нових елементів у середину масиву, використовуючи метод insert (_: at :) для окремих елементів

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

4) Використовуючи вставку (contentOf: at :), щоб вставити кілька елементів з іншої колекції або літералу масиву

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.