Thêm một phần tử vào một mảng trong Swift


340

Giả sử tôi có một mảng, ví dụ:

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

Và sau này tôi muốn đẩy / nối một phần tử vào cuối mảng đã nói, để có được:

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

Tôi nên sử dụng phương pháp nào?

Và những gì về trường hợp tôi muốn thêm một phần tử vào phía trước của mảng thì sao? Có một thời gian liên tục unshift?


95
Steve Jobs, Bill Gates, Linus Torvalds, nhưng Bret là ai? - Tôi cảm thấy mình nên biết (và có lẽ tôi sẽ tự đá mình khi phát hiện ra!)
Jimmery 17/03/2015

23

19
Bret Victor là chính xác. Tác phẩm của anh được cho là nguồn cảm hứng cho các bộ phận của swift
Fela Winkelmolen

3
trong tâm trí bạn không bao giờ có thể sử dụng đăng ký để thêm một yếu tố vào một chỉ mục mới . đăng ký chỉ được sử dụng để cập nhật một giá trị hoặc đọc từ một chỉ mục hiện có . Vì vậy, nếu bạn có let array = [Int]()bạn không bao giờ có thể nói array[0] = 42Nó sẽ đưa ra chỉ số ngoài phạm vi lỗi. Bạn nên sử dụng array.append(42). Tại sao bạn không thể đăng ký? Vì lý do tương tự bạn không thể làm letters[3] = dcho let letters = [a,b,c]. Chỉ mục thứ 3 không tồn tại dưới dạng mảng [0] trước một giá trị!
Mật ong

4
Đừng dạy anh ta cách làm điều này. Tim không nên được cho phép trong mảng này, đó là một sự xúc phạm đến những người khác ....
Otziii

Câu trả lời:


604

Kể từ Swift 3/4/5 , điều này được thực hiện như sau.

Để thêm một phần tử mới vào cuối của một mảng.

anArray.append("This String")

Để nối một Mảng khác vào cuối Mảng của bạn.

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

Để chèn một phần tử mới vào Mảng của bạn.

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

Để chèn nội dung của một mảng khác vào Mảng của bạn.

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

Thông tin thêm có thể được tìm thấy trong chương "Các loại bộ sưu tập" của " Ngôn ngữ lập trình Swift ", bắt đầu từ trang 110.


2
Câu trả lời chính xác. Sự không nhất quán trong cách Apple thực hiện điều này là loại khó chịu. Có lẽ, anArray + = "Foo" thực hiện tương tự như anArray + = ["Foo"] Cá nhân tôi sẽ chỉ sử dụng cú pháp sau để tránh nhầm lẫn bản thân.
original_username

11
anArray + = "Foo" không hoạt động nữa từ xCode 6 beta 5
Amitay

Bạn có thể làm một danh sách các phương thức và các hàm để tạo và điền vào một mảng không ?? : D

1
Đó là thất bại trong thời gian chạy. Có những yếu tố đã có trong mảng mà tôi đang cố gắng chèn, vì vậy đó không phải là nó. Cách giải quyết của tôi là tạo ra một mảng mới với phần tử mà tôi đang cố gắng chèn, sau đó nối thêm tất cả các phần tử từ mảng ban đầu. Khá chắc chắn đây là kết quả của vấn đề giữ lại ở nơi khác - bằng cách nào đó, các đối tượng này vẫn ổn miễn là chúng còn sót lại trong các mảng mảng ban đầu của chúng, nhưng nếu iOS cố gắng di chuyển chúng (do kết quả của việc chèn) thì sẽ có một sự cố. Hoặc nếu không thì đây là một số vấn đề Swift / IB kỳ lạ.
MusiGenesis

1
spliceđổi tên thành insertContentsOftrong Swift 2.
Almas Sapargali

21

Bạn cũng có thể truyền vào một biến và / hoặc đối tượng nếu bạn muốn.

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)

Để thêm chúng vào phía trước:

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

Như những người khác đã nêu, bạn không còn có thể sử dụng '+ =' kể từ xCode 6.1


2
Có nghĩa là, với việc thiếu một .prepend()chức năng, chèn vào đầu dường như là một cách tiếp cận tốt
Atticus

1
Rất rõ ràng bạn vẫn có thể sử dụng + = nhưng không phải cho một yếu tố duy nhất.
Leo Dabus

17

Để thêm vào cuối, sử dụng +=toán tử:

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

Toán tử đó thường tương đương với append(contentsOf:)phương thức. (Và trong các phiên bản Swift thực sự cũ, có thể nối thêm các phần tử đơn lẻ, không chỉ các bộ sưu tập khác có cùng loại phần tử.)

Ngoài ra còn có insert(_:at:)để chèn tại bất kỳ chỉ mục.

Nếu, giả sử, bạn muốn một chức năng tiện lợi để chèn lúc đầu, bạn có thể thêm nó vào Arraylớp bằng một phần mở rộng .


Nếu myArraylà loại Array, thì dòng đầu tiên không chính xác. Các +=nhà điều hành chỉ có thể được sử dụng nếu cả hai myArrayvà các toán hạng bên phải là loại Array.
Bart Jacobs

1
Nó đã trở lại chính xác khi tôi đăng câu trả lời này, nhưng ngôn ngữ đã thay đổi kể từ đó. Trả lời cập nhật.
gà trống

Nói điều đó +=appendtương đương là không chính xác, trước đây liên quan đến việc tạo ra một mảng tạm thời sẽ bị loại bỏ ngay khi hàm toán tử tiêu thụ nó.
Cristik

10

Sử dụng toán tử + = và +:

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
}

sau đó sử dụng :

var list = [AnyObject]()
list += "hello" 
list += ["hello", "world!"]
var list2 = list + "anything"

Trong hàm thứ hai, không cần lặp lại trên mảng bên trái. Làm var copy = leftvà sau đó nối thêm copy.append(right)là đủ. Trong Swift, mảng là loại giá trị, không phải loại tham chiếu.
Natan R.

4

Đây là một phần mở rộng nhỏ nếu bạn muốn chèn vào đầu mảng mà không mất mục ở vị trí đầu tiên

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

Lỗi: Giá trị của loại 'Mảng <Phần tử>' không có thành viên 'appendContentsOf'
Dani Kemper

3

Trong Swift 4.1 và Xcode 9.4.1

Chúng ta có thể thêm các đối tượng vào Array về cơ bản theo hai cách

let stringOne = "One"
let strigTwo = "Two"
let stringThree = "Three"
var array:[String] = []//If your array is string type

Loại 1)

//To append elements at the end
array.append(stringOne)
array.append(stringThree)

Loại 2)

//To add elements at specific index
array.insert(strigTwo, at: 1)

Nếu bạn muốn thêm hai mảng

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

Từ trang 143 của Ngôn ngữ lập trình Swift:

Bạn có thể thêm một mục mới vào cuối một mảng bằng cách gọi phương thức chắp thêm của mảng

Hoặc, thêm một mục mới vào cuối một mảng bằng toán tử gán bổ sung (+ =)

Trích từ: Apple Inc., Ngôn ngữ lập trình Swift. Sách điện tử. https://itun.es/us/jEUH0.l


2

Để thêm vào các giải pháp gợi ýappend , thật hữu ích khi biết rằng đây là hoạt động thời gian không đổi được khấu hao trong nhiều trường hợp:

Độ phức tạp: Khấu hao O (1) trừ khi lưu trữ tự chia sẻ với một mảng trực tiếp khác; O (tính) nếu bản thân không bọc NSArray bắc cầu; nếu không thì hiệu quả là không xác định.

Tôi đang tìm kiếm một consnhà điều hành tương tự cho Swift. Nó sẽ trả lại một mảng bất biến mới với phần tử được xử lý ở cuối, trong thời gian không đổi, mà không thay đổi mảng ban đầu. Tôi chưa tìm thấy một chức năng tiêu chuẩn thực hiện điều này. Tôi sẽ cố gắng nhớ báo cáo lại nếu tôi tìm thấy!


1

Bạn đã có thể sử dụng

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

1

Nếu bạn muốn nối thêm đối tượng duy nhất, bạn có thể mở rộng Array struct

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

1

Nếu mảng là NSArray, bạn có thể sử dụng addinghàm để thêm bất kỳ đối tượng nào ở cuối mảng, như sau:

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

Kết quả :

print(myArray) 
// ["First element", "Second element"]

Đó là một cách rất đơn giản, liên quan!


1

Trong Swift 4.2: Bạn có thể sử dụng

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

hoặc là

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

0

Ví dụ: sinh viên = ["Ben", "Ivy", "Jordell"]

1) Để thêm các phần tử đơn vào cuối một mảng, hãy sử dụng phần bổ sung (_ :)

students.append(\ "Maxime" )

2) Thêm nhiều phần tử cùng một lúc bằng cách chuyển một mảng khác hoặc một chuỗi bất kỳ loại nào sang phương thức chắp thêm (nội dungOf :)

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

3) Để thêm các phần tử mới vào giữa một mảng bằng cách sử dụng phương thức insert (_: at :) cho các phần tử đơn

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

4) Sử dụng insert (nội dungOf: at :) để chèn nhiều phần tử từ một bộ sưu tập hoặc mảng bằng chữ khác

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.