【问题标题】:Add an element to an array in Swift在 Swift 中将元素添加到数组中
【发布时间】:2014-07-23 01:19:06
【问题描述】:

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

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

稍后我想将一个元素推送/附加到所述数组的末尾,以获取:

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

我应该使用什么方法?

如果我想在数组的front中添加一个元素呢?是否有恒定的时间不移位?

【问题讨论】:

  • 史蒂夫·乔布斯、比尔·盖茨、莱纳斯·托瓦兹,但布雷特是谁? - 我觉得我应该知道(当我发现时我可能会踢自己!)
  • 布雷特维克多? worrydream.com
  • 布雷特维克多是正确的。据说他的作品是 swift 部分的灵感来源
  • 请记住,您永远不能使用 subscript 将元素添加到 new 索引中。下标仅用于更新值或从 现有 索引中读取。所以如果你有let array = [Int]() 你永远不能说array[0] = 42 它会给出 index out of range 错误。你应该使用array.append(42)。为什么不能下标?出于同样的原因,您不能为let letters = [a,b,c] 执行letters[3] = d。第三个索引不存在,值之前的数组 [0] 也不存在!
  • 不要教他怎么做。蒂姆不应该被允许进入这个数组,这是对其他人的侮辱......

标签: ios arrays swift xcode cocoa-touch


【解决方案1】:

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)

更多信息可以在“The Swift Programming Language”的“集合类型”一章中找到,从第 110 页开始。

【讨论】:

  • 很好的答案。苹果实现这一点的方式不一致有点令人恼火。据推测,anArray+="Foo"anArray+=["Foo"] 的作用相同。就我个人而言,我只会使用后一种语法以避免混淆。
  • anArray+="Foo" 不再适用于 xCode 6 beta 5
  • 你能列出创建和填充数组的方法和函数吗? :D
  • 运行时失败。我试图插入的数组中已经有元素,所以不是这样。我的解决方法是使用我尝试插入的元素创建一个新数组,然后附加原始数组中的所有元素。很确定这是其他地方保留问题的结果 - 不知何故,这些对象只要它们留在原来的数组位置就可以了,但是如果 iOS 尝试移动它们(作为插入的结果),就会发生崩溃。否则这是一些奇怪的 Swift/IB 问题。
  • splice 在 Swift 2 中重命名为 insertContentsOf
【解决方案2】:

如果你愿意,你也可以传入一个变量和/或对象。

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 开始,您不能再使用“+=”

【讨论】:

  • 有道理,由于缺少.prepend() 函数,在头部插入似乎是一个好方法
  • 很明显你仍然可以使用 += 但不能用于单个元素。
【解决方案3】:

要添加到末尾,请使用+= 运算符:

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

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

还有 insert(_:at:) 用于在任何索引处插入。

如果你想在开头插入一个方便的函数,你可以将它添加到 Array 类中,并带有 extension

【讨论】:

  • 如果myArray 的类型为Array,则第一行不正确。仅当myArray 和右操作数都是Array 类型时,才能使用+= 运算符。
  • 当我发布这个答案时它是正确的,但语言已经改变了。答案已更新。
  • +=append等价是不正确的,前者涉及创建一个临时数组,一旦操作符函数消耗它就会被丢弃。
【解决方案4】:

使用 += 和 + 运算符:

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 中,数组是值类型,而不是引用类型。
  • 如果没有编译,你可能还想添加extension Array where Element == YourClass {
【解决方案5】:

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

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

【讨论】:

  • 错误:'Array' 类型的值没有成员'appendContentsOf'
【解决方案6】:

在 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)

【讨论】:

    【解决方案7】:

    来自 The Swift Programming Language 的第 143 页:

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

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

    摘自:Apple Inc. “Swift 编程语言”。电子书。 https://itun.es/us/jEUH0.l

    【讨论】:

      【解决方案8】:

      要添加到solutions suggesting append,知道在许多情况下这是一个摊销常数时间操作很有用:

      复杂性:摊销 O(1),除非自己的存储与另一个实时数组共享; O(count) 如果 self 不包装桥接的 NSArray;否则效率不详。

      我正在为 Swift 寻找类似 @​​987654323@ 的运算符。它应该以恒定的时间返回一个 new 不可变数组,该数组的末尾添加了元素,而不会更改原始数组。我还没有找到执行此操作的标准函数。如果我找到一个,我会尽量记得报告!

      【讨论】:

        【解决方案9】:

        你可以使用

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

        【讨论】:

          【解决方案10】:

          如果要追加唯一对象,可以展开Array struct

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

          【讨论】:

            【解决方案11】:

            如果数组是 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"]
            

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

            【讨论】:

              【解决方案12】:

              在 Swift 4.2 中: 你可以使用

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

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

              【讨论】:

                【解决方案13】:

                示例:学生 = ["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 )

                【讨论】:

                  【解决方案14】:

                  使用双端队列代替数组

                  Deque 相对于Array 的主要优势在于它支持高效的两端插入和删除。

                  https://swift.org/blog/swift-collections/

                  
                  var names:Deque = ["Steve", "Bill", "Linus", "Bret"]
                  
                  
                  

                  在名称末尾添加“Tim”

                  names.append("Tim")
                  

                  在名称开头添加“Tim”

                  names.prepend("John")
                  

                  删除名称的第一个元素

                  names.popFirst() // "John"
                  

                  删除名称的最后一个元素

                  names.popLast() // "Tim"
                  

                  【讨论】:

                    【解决方案15】:

                    Swift 5.3,我相信。

                    正常数组是var myArray = ["Steve", "Bill", "Linus", "Bret"] 并且你想在数组中添加"Tim",那么你可以使用myArray.insert("Tim", at=*index*)所以如果你想在数组的back添加它,那么你可以使用myArray.append("Tim", at: 3)

                    【讨论】:

                      猜你喜欢
                      • 2020-04-07
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-03-16
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多