เพิ่มองค์ประกอบให้กับอาร์เรย์ใน Swift


340

สมมติว่าฉันมีอาร์เรย์ตัวอย่างเช่น:

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

และต่อมาฉันต้องการที่จะผลักดัน / ผนวกองค์ประกอบท้ายแถวดังกล่าวเพื่อรับ:

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

ฉันควรใช้วิธีใด

แล้วในกรณีที่ฉันต้องการเพิ่มองค์ประกอบที่ด้านหน้าของอาร์เรย์? มีเวลาคงที่ไม่เปลี่ยนแปลงหรือไม่


95
Steve Jobs, Bill Gates, Linus Torvalds แต่ใครคือเบร็ท - ฉันรู้สึกเหมือนฉันควรรู้ (และฉันอาจจะเตะตัวเองเมื่อฉันพบ!)
Jimmery

23
เบรทวิกเตอร์? wordream.com
onekiloparsec

19
Bret Victor ถูกต้อง งานของเขาได้รับการกล่าวถึงว่าเป็นแรงบันดาลใจในการทำงานอย่างรวดเร็ว
Fela Winkelmolen

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สามารถทำได้ดังนี้

ในการเพิ่มองค์ประกอบใหม่ไปยังจุดสิ้นสุดของ Array

anArray.append("This String")

เพื่อผนวก Array อื่นต่อท้าย Array ของคุณ

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

เพื่อแทรกองค์ประกอบใหม่เข้าไปใน Array ของคุณ

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

เมื่อต้องการแทรกเนื้อหาของ Array อื่นเข้าไปใน Array ของคุณ

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

ข้อมูลเพิ่มเติมสามารถพบได้ในบท "ประเภทคอลเลกชัน" ของ " ภาษาการเขียนโปรแกรม Swift " เริ่มต้นที่หน้า 110


2
คำตอบที่ดี ความไม่สอดคล้องกันในวิธีที่แอปเปิ้ลนำมาใช้เป็นสิ่งที่น่ารำคาญ สมมุติว่า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
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
เป็นที่ชัดเจนว่าคุณยังคงสามารถใช้ + = แต่ไม่ใช่สำหรับองค์ประกอบเดียว
Leo Dabus

17

ในการเพิ่มไปยังส่วนท้ายให้ใช้+=โอเปอเรเตอร์:

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

ตัวดำเนินการนั้นโดยทั่วไปเทียบเท่ากับappend(contentsOf:)วิธีการ (และใน Swift เวอร์ชันเก่าจริง ๆ สามารถผนวกองค์ประกอบเดียวได้ไม่ใช่แค่คอลเล็กชันอื่น ๆ ของประเภทองค์ประกอบเดียวกัน)

นอกจากนี้ยังมีinsert(_:at:)การแทรกที่ดัชนีใด ๆ

ถ้าพูดคุณต้องการฟังก์ชั่นอำนวยความสะดวกสำหรับการแทรกที่จุดเริ่มต้นที่คุณสามารถเพิ่มไปยังArrayระดับที่มีส่วนขยาย


ถ้าmyArrayเป็นประเภทArrayแล้วบรรทัดแรกไม่ถูกต้อง +=ผู้ประกอบการสามารถใช้ได้เฉพาะถ้าทั้งสองและถูกดำเนินการทางด้านขวาเป็นประเภทmyArray Array
Bart Jacobs

1
มันถูกต้องย้อนกลับเมื่อฉันโพสต์คำตอบนี้ แต่ภาษามีการเปลี่ยนแปลงตั้งแต่ อัปเดตคำตอบแล้ว
rickster

การพูดว่า+=และ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 อาร์เรย์คือชนิดของค่าไม่ใช่ประเภทการอ้างอิง
Natan R.

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

เราสามารถเพิ่มวัตถุเข้าไปใน 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

จากหน้า 143 ของภาษาโปรแกรม Swift:

คุณสามารถเพิ่มรายการใหม่ไปยังจุดสิ้นสุดของอาร์เรย์ได้โดยเรียกวิธีการต่อท้ายของอาร์เรย์

หรือเพิ่มรายการใหม่ไปยังจุดสิ้นสุดของอาร์เรย์ด้วยตัวดำเนินการการมอบหมายเพิ่มเติม (+ =)

ข้อความที่ตัดตอนมาจาก: Apple Inc. “ ภาษาการเขียนโปรแกรม Swift” iBooks https://itun.es/us/jEUH0.l


2

ในการเพิ่มโซลูชันที่แนะนำappendคุณควรทราบว่านี่เป็นการดำเนินการเวลาคงที่ที่ตัดจำหน่ายในหลายกรณี:

ความซับซ้อน: ค่าตัดจำหน่าย O (1) ยกเว้นว่าที่เก็บข้อมูลของตัวเองถูกแชร์กับอาร์เรย์สดอื่น O (นับ) ถ้าตนเองไม่ห่อ NSArray บริดจ์ มิฉะนั้นประสิทธิภาพจะไม่ได้รับการกำหนด

ฉันกำลังมองหาconsโอเปอเรเตอร์ที่ชอบสำหรับ Swift มันควรจะคืนค่าอาเรย์ที่ไม่เปลี่ยนรูปแบบใหม่ด้วยองค์ประกอบที่ติดอยู่ที่ปลายในเวลาคงที่โดยไม่ต้องเปลี่ยนอาเรย์เดิม ฉันยังไม่พบฟังก์ชันมาตรฐานที่ทำสิ่งนี้ ฉันจะพยายามอย่าลืมรายงานกลับถ้าฉันเจอ!



1

หากคุณต้องการที่จะผนวกวัตถุที่ไม่ซ้ำกันคุณสามารถขยายอาร์เรย์ struct

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

ตัวอย่าง: นักเรียน = ["เบ็น", "Ivy", "Jordell"]

1) ในการเพิ่มองค์ประกอบเดียวในตอนท้ายของอาร์เรย์ให้ใช้ผนวก (_ :)

students.append(\ "Maxime" )

2) เพิ่มองค์ประกอบหลายรายการในเวลาเดียวกันโดยผ่านอาร์เรย์อื่นหรือลำดับของชนิดใด ๆ เพื่อผนวก (วิธี contentOf :)

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

3) เพื่อเพิ่มองค์ประกอบใหม่ในช่วงกลางของอาร์เรย์โดยใช้วิธีการแทรก (_: ที่ :) สำหรับองค์ประกอบเดียว

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

4) การใช้ insert (contentOf: at :) เพื่อแทรกอิลิเมนต์หลายตัวจากคอลเล็กชันหรือตัวอักษรอาร์เรย์อื่น

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.