Swift에서 배열을 연결하거나 병합하려면 어떻게합니까?


답변:


691

으로 배열을 연결하여 +새 배열을 만들 수 있습니다

let c = a + b
print(c) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]

또는 +=(또는 append) 를 사용하여 한 배열을 다른 배열에 추가하십시오 .

a += b

// Or:
a.append(contentsOf: b)  // Swift 3
a.appendContentsOf(b)    // Swift 2
a.extend(b)              // Swift 1.2

print(a) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]

[AnyObect]? CGFloat와 동일하지 않습니다. AnyObject 배열에 연결하는 동안.
khunshan

6
쿤산 : AnyObject객체를 나타냅니다. 이해할 수 있듯이 클래스 유형에서 인스턴스화 된 것을 의미합니다. CGFloat객체가 아니라 스칼라 값입니다. 내가 이해하는 것처럼 배열은 포함으로 정의 AnyObject되거나 더 세분화 되지 않는 한 스칼라를 포함 할 수 있습니다 . 그러나 여기서 문제는 배열이 옵션으로 래핑되어 있으므로 먼저 !또는 래핑을 풀어야한다는 것입니다 ?.
Owen Godfrey

우리는 스위프트 2의 기록 중 복사 된 정보가 있는지 여부를 결정하는 확장 여부를 알아 b의 일부 a수정이 (그러므로 가능성의 사본 eliding b동안을 a.appendContentsOf(b))?
Ephemera

1
@OwenGodfrey 감사합니다. appendContentsOf 및 insertContentsOf에 대해 혼동이 있습니다.
khunshan


137

Swift 5를 사용하면 필요에 따라 다음 6 가지 방법 중 하나를 선택 하여 두 배열을 연결 / 병합 할 수 있습니다.


#1. Array+(_:_:)일반 연산자 를 사용하여 두 개의 배열을 새 배열로 병합

Array+(_:_:)일반적인 연산자를. +(_:_:)다음과 같은 선언이 있습니다 .

컬렉션의 요소와 시퀀스를 연결하여 새 컬렉션을 만듭니다.

static func + <Other>(lhs: Array<Element>, rhs: Other) -> Array<Element> where Other : Sequence, Self.Element == Other.Element

다음 Playground 샘플 코드는 일반 연산자를 [Int]사용하여 두 유형의 배열을 새 배열로 병합하는 방법을 보여줍니다 +(_:_:).

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenArray = array1 + array2
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

# 2. Array+=(_:_:)일반 연산자 를 사용하여 배열의 요소를 기존 배열에 추가

Array+=(_:_:)일반적인 연산자를. +=(_:_:)다음과 같은 선언이 있습니다 .

시퀀스의 요소를 범위 교체 가능한 컬렉션에 추가합니다.

static func += <Other>(lhs: inout Array<Element>, rhs: Other) where Other : Sequence, Self.Element == Other.Element

다음 Playground 샘플 코드는 일반 연산자를 [Int]사용하여 형식 배열의 요소를 기존 배열 에 추가하는 방법을 보여줍니다 +=(_:_:).

var array1 = [1, 2, 3]
let array2 = [4, 5, 6]

array1 += array2
print(array1) // prints [1, 2, 3, 4, 5, 6]

#삼. Arrayappend(contentsOf:)메소드를 사용하여 다른 배열에 배열 추가

스위프트 Array에는 append(contentsOf:)방법이 있습니다. append(contentsOf:)다음과 같은 선언이 있습니다 .

시퀀스 또는 컬렉션의 요소를이 컬렉션의 끝에 추가합니다.

mutating func append<S>(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element

다음 Playground 샘플 코드는 메소드를 [Int]사용하여 다른 유형의 배열에 배열을 추가하는 방법을 보여줍니다 append(contentsOf:).

var array1 = [1, 2, 3]
let array2 = [4, 5, 6]

array1.append(contentsOf: array2)
print(array1) // prints [1, 2, 3, 4, 5, 6]

# 4. SequenceflatMap(_:)방법 으로 두 배열을 새 배열로 병합

Swift는 프로토콜을 포함 flatMap(_:)하는 모든 유형에 대한 방법을 제공 Sequence합니다 (포함 Array). flatMap(_:)다음과 같은 선언이 있습니다 .

이 시퀀스의 각 요소를 사용하여 지정된 변환을 호출 한 결과를 포함하는 배열을 반환합니다.

func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence

다음 Playground 샘플 코드는 메소드를 [Int]사용하여 두 유형의 배열을 새 배열로 병합하는 방법을 보여줍니다 flatMap(_:).

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenArray = [array1, array2].flatMap({ (element: [Int]) -> [Int] in
    return element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

# 5. 하여 새로운 배열로 두 배열 병합 Sequencejoined()방법 및 ArrayS ' init(_:)이니셜

Swift는 프로토콜을 포함 joined()하는 모든 유형에 대한 방법을 제공 Sequence합니다 (포함 Array). joined()다음과 같은 선언이 있습니다 .

이 시퀀스 순서의 요소를 연결하여 반환합니다.

func joined() -> FlattenSequence<Self>

또한 Swift Array에는 init(_:)초기화 프로그램이 있습니다. init(_:)다음과 같은 선언이 있습니다 .

시퀀스의 요소를 포함하는 배열을 만듭니다.

init<S>(_ s: S) where Element == S.Element, S : Sequence

따라서 다음 Playground 샘플 코드는 메소드와 이니셜 라이저를 [Int]사용하여 두 유형의 배열을 새 배열로 병합하는 방법을 보여줍니다 .joined()init(_:)

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenCollection = [array1, array2].joined() // type: FlattenBidirectionalCollection<[Array<Int>]>
let flattenArray = Array(flattenCollection)
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

# 6. Arrayreduce(_:_:)방법 으로 두 배열을 새 배열로 병합

스위프트 Array에는 reduce(_:_:)방법이 있습니다. reduce(_:_:)다음과 같은 선언이 있습니다 .

주어진 클로저를 사용하여 시퀀스의 요소를 결합한 결과를 반환합니다.

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

다음 Playground 코드는 메소드를 [Int]사용하여 두 유형의 배열을 새 배열로 병합하는 방법을 보여줍니다 reduce(_:_:).

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenArray = [array1, array2].reduce([], { (result: [Int], element: [Int]) -> [Int] in
    return result + element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

5
이 코드를 공유 해주셔서 감사합니다. 설명에 대한 답변 만 드리겠습니다. 어떤 것이 성능면에서 더 효율적이라고 말하면 좋을까요?
kokemomuke

나는 +2 개의 배열과 joined()배열의 배열을 좋아 합니다.
Cœur

두 개 이상의 배열 (또는 문자열 또는 다른 것)을 병합하는 경우 +연산자 를 사용하지 못하게하면 컴파일 시간이 완전히 미치게됩니다.
lawicko

@lawicko 어떤 방법을 추천 하시겠습니까?
CyberMew

@CyberMew 오버로드 된 연산자를 사용하지 않는 것은 가장 읽기 쉬운 것으로 생각하기 때문에 방법 # 3을 좋아하지만 평면지도가있는 방법 # 4도 좋아합니다. 문자열의 경우 마지막에 결합 된 문자열을 즉시 얻으므로 방법 # 5를 좋아합니다.
lawicko

34

운영자 과부하가 큰 팬이 아니거나 기능 유형이 더 많은 경우 :

// use flatMap
let result = [
    ["merge", "me"], 
    ["We", "shall", "unite"],
    ["magic"]
].flatMap { $0 }
// Output: ["merge", "me", "We", "shall", "unite", "magic"]

// ... or reduce
[[1],[2],[3]].reduce([], +)
// Output: [1, 2, 3]

22

Swift 2.0 이후 가장 좋아하는 방법은 평평합니다.

var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]

let c = [a, b].flatten()

이것은 FlattenBidirectionalCollection당신 CollectionType이 이것을 원한다면 충분할 것이고 무료로 게으른 평가를 가질 것입니다. 정확히 배열이 필요한 경우 다음을 수행 할 수 있습니다.

let c = Array([a, b].flatten())

2
flatten()요즘 더 이상 존재하지 않는 것 같습니다. 그러나 당신은 고려할 수 있습니다 joined().
Cœur

13

가능한 대안 목록을 완성하려면 flattenreduce 동작을 구현하는 데 사용할 수 있습니다 .

var a = ["a", "b", "c"] 
var b = ["d", "e", "f"]

let res = [a, b].reduce([],combine:+)

제시된 것 중 가장 좋은 대안 (성능 / 메모리 측면)은 단순히 flatten새로운 배열 구조를 만들지 않고 원래 배열을 느리게 감싸는 것입니다.

하지만 그 통지를 펼치기는 반환하지 않습니다LazyCollection게으른 행동이 체인 (지도, flatMap, 필터 등)에 따라 다음 작업에 전파되지 않습니다 그래서.

특정 경우에 게으름이 의미가있는 경우 Tomasz 샘플을 다음과 같이 수정하는 등의 접두사 를 추가하거나 추가해야 .lazy합니다 flatten().

let c = [a, b].lazy.flatten()

이 답변은 2019 년에도 Swift 5.1에서 얼마나 잘 유지됩니까?
willbattel

flatten ()은 더 이상 존재하지 않습니다. flatten () 대신 joined ()을 사용할 수 있습니다
Pranav Pravakar

4

특정 인덱스 뒤에 두 번째 배열을 삽입하려면 Swift 2.2에서 다음을 수행하십시오.

let index = 1
if 0 ... a.count ~= index {
     a[index..<index] = b[0..<b.count]
}
print(a) // [1.0, 4.0, 5.0, 6.0, 2.0, 3.0] 

4

스위프트 3.0

더하기 연산자 ( +)를 사용하여 호환 가능한 유형을 가진 두 개의 기존 배열을 함께 추가하여 새 배열을 만들 수 있습니다 . 새 배열의 유형은 함께 추가 한 두 배열의 유형에서 유추됩니다.

let arr0 = Array(repeating: 1, count: 3) // [1, 1, 1]
let arr1 = Array(repeating: 2, count: 6)//[2, 2, 2, 2, 2, 2]
let arr2 = arr0 + arr1 //[1, 1, 1, 2, 2, 2, 2, 2, 2]

이것은 위 코드의 올바른 결과입니다.


4
var arrayOne = [1,2,3]
var arrayTwo = [4,5,6]

다음과 같이 결과를 원하면 : [1,2,3, [4,5,6]]

arrayOne.append(arrayTwo)

위의 코드는 arrayOne을 단일 요소로 변환하여 arrayTwo의 끝에 추가합니다.

[1, 2, 3, 4, 5, 6]과 같은 결과를 원하면

arrayOne.append(contentsOf: arrayTwo)

위의 코드는 arrayTwo의 끝에 arrayOne의 모든 요소를 ​​추가합니다.

감사.


4

스위프트 4.X

내가 아는 가장 쉬운 방법은 + 기호를 사용하는 것입니다.

var Array1 = ["Item 1", "Item 2"]
var Array2 = ["Thing 1", "Thing 2"]

var Array3 = Array1 + Array2

// Array 3 will just be them combined :)

3

두 배열을 병합하는 가장 짧은 방법은 다음과 같습니다.

 var array1 = [1,2,3]
 let array2 = [4,5,6]

연결 / 병합

array1 += array2
New value of array1 is [1,2,3,4,5,6]

1

마찬가지로 배열의 사전을 사용하여 다음을 수행 할 수 있습니다.

var dict1 = [String:[Int]]()
var dict2 = [String:[Int]]()
dict1["key"] = [1,2,3]
dict2["key"] = [4,5,6]
dict1["key"] = dict1["key"]! + dict2["key"]!
print(dict1["key"]!)

"키"가 일치하면 dict1을 반복하고 dict2를 추가 할 수 있습니다


0

데이터 유형이 다른 마지 배열 :

var arrayInt = [Int]()
arrayInt.append(6)
var testArray = ["a",true,3,"b"] as [Any]
testArray.append(someInt)

출력 :

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