在Swift中向数组添加元素


340

假设我有一个数组,例如:

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

然后我想将一个元素推/追加到所述数组的末尾,以获得:

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

我应该使用哪种方法?

那我想在数组的前面添加一个元素呢?是否有固定的时间班次?


95
史蒂夫·乔布斯,比尔·盖茨,莱纳斯·托瓦尔兹,但布雷特是谁?-我觉得我应该知道(当我发现时,我可能会踢自己!)
吉米里

23
布雷特·维克托(Bret Victor)?feardream.com
onekiloparsec 2015年

19
布雷特·维克托(Bret Victor)是正确的。他的工作是说已经为迅速的部分灵感
费拉Winkelmolen

3
切记您永远不能使用下标将元素添加到索引中。下标仅用于更新值或从现有索引读取。因此,如果您拥有该索引,let array = [Int]()则永远不能说它array[0] = 42将给索引超出范围的错误。您应该使用array.append(42)。你为什么不能下标?对于你不能做同样的原因letters[3] = dlet letters = [a,b,c]。第三个索引不存在,值之前的array [0]也是如此!
亲爱的人

4
不要教他怎么做。蒂姆不应该被允许进入这个
阵营

Answers:


603

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页开始的“ Swift编程语言 ” 的“集合类型”一章中找到。


2
好答案。苹果实施此方法的不一致令人不快。大概,anArray + =“ Foo”anArray + = [“” Foo“]做同样的事情,就我个人而言,我只会使用后一种语法以避免混淆自己。
original_username

11
xCode

您能否列出创建和填充数组的方法和函数?:D

1
它在运行时失败。我正在尝试插入数组中的元素,事实并非如此。我的解决方法是使用尝试插入的元素创建一个新数组,然后附加原始数组中的所有元素。可以肯定的是,这是其他地方存在保留问题的结果-只要将这些对象保留在其原始数组位置中,它们就可以很好地使用,但是如果iOS尝试移动它们(由于插入),则会发生崩溃。否则,这是一些奇怪的Swift / IB问题。
MusiGenesis

1
splice重命名为insertContentsOf斯威夫特2
阿尔玛斯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 2014年

1
很清楚,您仍然可以使用+ =,但不能用于单个元素。
Leo Dabus 2014年

17

要添加到最后,请使用+=运算符:

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

该运算符通常等效于 append(contentsOf:)方法。(在真正的旧Swift版本中,可以附加单个元素,而不仅仅是附加相同元素类型的其他集合。)

insert(_:at:)可以在任何索引处插入。

举例来说,如果您希望在开始时插入方便的功能,则可以Array使用extension将其添加到类中。


如果myArray是类型Array,则第一行不正确。在+=如果两个运算符只能使用myArray和正确的操作数是类型Array
巴特·雅各布斯

1
当我发布此答案时是正确的,但是此后语言已更改。答案已更新。
rickster

+=append等价是不正确的,前者涉及创建一个临时数组,一旦操作员函数使用它,它将立即被丢弃。
Cristik '19

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中,数组是值类型,而不是引用类型。
Natan R.

4

如果您希望在数组的开头插入而不丢失第一个位置的内容,这是一个小的扩展

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

错误:值类型的“数组<元素>”没有成员“appendContentsOf”
达尼肯珀

3

在Swift 4.1和Xcode 9.4.1中

我们基本上可以通过两种方式将对象添加到Array中

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

从The Swift Programming Language的143页开始:

您可以通过调用数组的append方法将新项目添加到数组的末尾

或者,使用加法赋值运算符(+ =)将新项添加到数组的末尾

摘录自:苹果公司“ The Swift Programming Language”。iBooks。https://itun.es/us/jEUH0.l


2

要增加建议append解决方案,在许多情况下知道这是一个摊销的恒定时间操作很有用:

复杂性:摊销O(1),除非将自己的存储与另一个活动数组共享;否则,将进行摊销。如果self不包装桥接的NSArray,则为O(count);否则为false。否则,效率未指定。

我在寻找consSwift 的类似运算子。它应在不更改原始数组的情况下,在恒定时间内返回一个新的不可变数组,并将元素添加到最后。我尚未找到执行此操作的标准函数。如果找到一个,我会尽量记得报告!



1

如果要附加唯一对象,则可以展开Array结构

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

问候,这是一种非常简单的方法!



0

例如:students = [“ 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 )

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.