Swift에서 배열에 요소 추가


340

예를 들어 배열이 있다고 가정하십시오.

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

그리고 나중에 해당 배열의 끝에 요소를 푸시 / 추가하여 다음을 얻습니다.

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

어떤 방법을 사용해야합니까?

그리고 배열 앞에 요소를 추가하려는 경우는 어떻습니까? 변하지 않는 일정한 시간이 있습니까?


95
스티브 잡스, 빌 게이츠, 리누스 토발즈,하지만 브렛은 누구입니까? -알아야 할 것 같은 느낌이들 것입니다. (그리고 내가 알게되면 아마 차를!을 것입니다!)
Jimmery

23
브렛 빅터? worrydream.com
onekiloparsec

19
브렛 빅터가 맞습니다. 그의 작품은 신속한 부분에 영감을 준 것으로 알려져 있습니다
Fela Winkelmolen

3
아래 첨자 를 사용 하여 요소를 색인 에 추가 할 수는 없습니다 . 아래 첨자는 값을 업데이트하거나 기존 색인 에서 읽는 데만 사용됩니다 . 그래서 당신이있는 경우에 let array = [Int]()당신은 말할 수 없다 array[0] = 42그것은 줄 것이다 범위에서 인덱스 오류가 발생했습니다. 을 사용해야합니다 array.append(42). 왜 아래 첨자를 쓸 수 없습니까? 당신이 할 수없는 같은 이유 letters[3] = d에 대해 let letters = [a,b,c]. 3 번째 인덱스는 값 앞에 배열 [0]과 같이 존재하지 않습니다!
Honey

4
이 작업을 수행하는 방법을 가르쳐주지 마십시오. 이 배열에서 팀을 허용해서는 안되며 다른 배열에 대한 모욕도 허용됩니다 ....
Otziii

답변:


604

Swift 3/4/5 기준 으로 다음과 같이 수행됩니다.

Array 끝에 새 요소를 추가합니다.

anArray.append("This String")

배열 끝에 다른 배열을 추가합니다.

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

새 요소를 배열에 삽입합니다.

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

다른 Array의 내용을 Array에 삽입합니다.

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

자세한 정보는 " Swift Programming Language " 의 "컬렉션 유형"장 , 110 페이지 에서 찾을 수 있습니다 .


2
좋은 대답입니다. 애플이 이것을 구현하는 방식의 불일치는 자극적이다. 아마도 anArray + = "Foo"anArray + = [ "Foo"] 와 같은 일을 할 것입니다 . 개인적으로, 나는 혼동을 피하기 위해 후자의 구문만을 사용할 것입니다.
original_username

11
anArray + = "Foo"는 더 이상 xCode 6 베타 5에서 작동하지 않습니다
Amitay

배열을 만들고 채우는 메소드와 함수를 목록으로 만들 수 있습니까 ?? : D

1
런타임에 실패했습니다. 배열에 이미 삽입하려는 요소가 있으므로 그렇지 않습니다. 해결 방법은 삽입하려는 요소로 새 배열을 만든 다음 원래 배열의 모든 요소를 ​​추가하는 것입니다. 이것은 다른 곳에서 유지 문제의 결과라는 것을 확신하십시오. 어쨌든이 객체는 원래 배열 지점에 남아있는 한 괜찮지 만 iOS가 삽입의 결과로 객체를 이동하려고하면 충돌이 발생합니다. 아니면 다른 이상한 Swift / IB 문제입니다.
MusiGenesis

1
spliceinsertContentsOfSwift 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)
    }
}

오류 : 값 타입의 '배열 <요소>'더 멤버 '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

스위프트 프로그래밍 언어의 143 페이지에서 :

배열의 append 메소드를 호출하여 배열 끝에 새 항목을 추가 할 수 있습니다

또는 더하기 대입 연산자 (+ =)를 사용하여 배열 끝에 새 항목을 추가하십시오.

발췌 : Apple Inc.“Swift Programming Language.” iBooks. https://itun.es/us/jEUH0.l


2

제안append 하는 솔루션에 추가하려면 이것이 많은 경우에 상각 된 일정 시간 작업 이라는 것을 아는 것이 유용합니다 .

복잡성 : 자체 스토리지가 다른 라이브 어레이와 공유되지 않는 한 상각 된 O (1); self가 브리지 된 NSArray를 랩핑하지 않으면 O (count); 그렇지 않으면 효율성이 지정되지 않습니다.

consSwift와 비슷한 연산자를 찾고 있습니다. 원래 배열을 변경하지 않고 일정한 시간에 요소가 끝에 고정 된 새로운 불변 배열을 반환해야합니다 . 아직이 작업을 수행하는 표준 기능을 찾지 못했습니다. 찾은 경우 다시보고해야합니다.


1

당신은 사용할 수 있습니다

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

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

매우 간단한 방법입니다.


1

Swift 4.2에서 : 사용할 수 있습니다

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

또는

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

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 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.