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

253

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

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

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

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

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

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

  • 78
    Стив Джобс, Билл Гейтс, Линус Торвальдс, но кто такой Брет? - Я чувствую, что должен знать (и я, вероятно, собираюсь пнуть себя, когда узнаю!)
  • 17
    Брет Виктор? worrydream.com
Показать ещё 3 комментария
Теги:
arrays

9 ответов

434
Лучший ответ

У вас было несколько вариантов добавления элемента в массив. В ранних бета-версиях вы могли бы использовать оператор + = для добавления отдельного элемента, но это уже не так. Тем не менее, вы можете использовать функцию добавления.

anArray.append("This String")

Если вы хотите добавить в свой массив больше элементов из другого массива, вы все равно можете использовать оператор + = или метод расширения.

anArray += ["Moar", "Strings"]
anArray.extend(["Moar", "Strings"])

Чтобы вставить один объект в начале массива, вы можете использовать метод insert.

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

Чтобы вставить содержимое другого массива в начале массива, вы можете использовать метод сплайсинга.

anArray.insertContentsOf(["So", "Many", "Strings"], at: 0)

В случае insert и insertContentsOf аргумент seconds может быть любым допустимым индексом принимающего массива.

Более подробную информацию можно найти в главе "Типы коллекций" "Язык быстрого программирования", начиная со страницы 110.


Как и у Swift 3, приведенные выше примеры должны быть записаны следующим образом.

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

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)
  • 1
    Отличный ответ. Несоответствие в том, как Apple реализовала это, вызывает раздражение. Предположительно, anArray + = "Foo" делает то же самое, что anArray + = ["Foo"]. Лично я буду использовать последний синтаксис, чтобы не запутаться.
  • 11
    anArray + = "Foo" больше не работает из xCode 6 beta 5
Показать ещё 6 комментариев
14

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

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() , вставка в .prepend() кажется хорошим подходом
  • 1
    Совершенно очевидно, что вы все еще можете использовать + =, но не для одного элемента.
14

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

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

Этот оператор эквивалентен методу append().

Там также insert(:, atIndex:) для вставки в любой индекс. (См. Справочник по массиву.)

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

  • 0
    Если myArray имеет тип Array , то первая строка неверна. Оператор += можно использовать, только если myArray и правый операнд имеют тип Array .
  • 1
    Это было правильно, когда я отправил этот ответ, но с тех пор язык изменился. Ответ обновлен.
Показать ещё 1 комментарий
8

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

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"
4

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

extension Array{
    mutating func appendAtBeginning(newItem : Element){
        let copy = self
        self = []
        self.append(newItem)
        self.appendContentsOf(copy)
    }
}
  • 0
    Ошибка: значение типа 'Массив <Элемент>' не имеет члена 'appendContentsOf'
2

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

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

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

1

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

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

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

Myarray.insert("Data #\(index)", atIndex: index)
1

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

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

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

Отрывок из: Apple Inc. "Быстрый язык программирования". интерактивные книги. https://itun.es/us/jEUH0.l

Ещё вопросы

Сообщество Overcoder
Наверх
Меню