[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]
#삼. Array
의 append(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. Sequence
의 flatMap(_:)
방법 으로 두 배열을 새 배열로 병합
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. 하여 새로운 배열로 두 배열 병합 Sequence
의 joined()
방법 및 Array
S ‘ 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. Array
의 reduce(_:_:)
방법 으로 두 배열을 새 배열로 병합
스위프트 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]
이것은 위 코드의 올바른 결과입니다.