답변:
으로 배열을 연결하여 +
새 배열을 만들 수 있습니다
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]
AnyObject
객체를 나타냅니다. 이해할 수 있듯이 클래스 유형에서 인스턴스화 된 것을 의미합니다. CGFloat
객체가 아니라 스칼라 값입니다. 내가 이해하는 것처럼 배열은 포함으로 정의 AnyObject
되거나 더 세분화 되지 않는 한 스칼라를 포함 할 수 있습니다 . 그러나 여기서 문제는 배열이 옵션으로 래핑되어 있으므로 먼저 !
또는 래핑을 풀어야한다는 것입니다 ?
.
b
의 일부 a
수정이 (그러므로 가능성의 사본 eliding b
동안을 a.appendContentsOf(b)
)?
Swift 5를 사용하면 필요에 따라 다음 6 가지 방법 중 하나를 선택 하여 두 배열을 연결 / 병합 할 수 있습니다.
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]
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]
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]
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]
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]
+
2 개의 배열과 joined()
배열의 배열을 좋아 합니다.
+
연산자 를 사용하지 못하게하면 컴파일 시간이 완전히 미치게됩니다.
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()
스위프트 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]
이것은 위 코드의 올바른 결과입니다.
두 배열을 병합하는 가장 짧은 방법은 다음과 같습니다.
var array1 = [1,2,3]
let array2 = [4,5,6]
연결 / 병합
array1 += array2
New value of array1 is [1,2,3,4,5,6]