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

다음과 같이 신속하게 생성 된 두 개의 배열이있는 경우 :

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

그것들은 어떻게 병합 될 수 [1, 2, 3, 4, 5, 6]있습니까?



답변

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

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]


답변

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]


답변

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

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


답변

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


답변

가능한 대안 목록을 완성하려면 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()


답변

특정 인덱스 뒤에 두 번째 배열을 삽입하려면 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] 


답변

스위프트 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]

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