回答:
で配列を連結して+
、新しい配列を作成できます
let c = a + b
print(c) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
または+=
(またはappend
)で1つの配列を他の配列に追加します:
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つの方法のいずれかを選択して、2つの配列を連結/マージできます。
Array
の+(_:_:)
ジェネリック演算子を使用して、2つの配列を新しい配列にマージしますArray
持っている+(_:_:)
一般的な演算子を。+(_:_:)
次の宣言があります:
コレクションとシーケンスの要素を連結して、新しいコレクションを作成します。
static func + <Other>(lhs: Array<Element>, rhs: Other) -> Array<Element> where Other : Sequence, Self.Element == Other.Element
次のPlaygroundサンプルコードは[Int]
、+(_:_:)
一般的な演算子を使用して2つの型の配列を新しい配列にマージする方法を示しています。
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:)
メソッドで配列を別の配列に追加するSwift 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(_:)
メソッドで2つの配列を新しい配列にマージしますSwiftは、プロトコル(を含む)にflatMap(_:)
準拠するすべてのタイプのメソッドを提供しSequence
ますArray
。flatMap(_:)
次の宣言があります:
このシーケンスの各要素で指定された変換を呼び出した結果を連結した配列を返します。
func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
次のPlaygroundサンプルコードは[Int]
、flatMap(_:)
メソッドを使用して2つの型の配列を新しい配列にマージする方法を示しています。
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
の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(_:)
初期化子を使用して、2つの型の配列を新しい配列にマージする方法を示しています。
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(_:_:)
メソッドで2つの配列を新しい配列にマージしますSwift Array
にはreduce(_:_:)
メソッドがあります。reduce(_:_:)
次の宣言があります:
指定されたクロージャを使用してシーケンスの要素を組み合わせた結果を返します。
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
次のPlaygroundコードは[Int]
、reduce(_:_:)
メソッドを使用して2つの型の配列を新しい配列にマージする方法を示しています。
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()
。
+
演算子を使用しないようにしてください。コンパイル時間が非常に狂います。
スウィフト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())
可能な選択肢のリストを完成reduce
させるために、flattenの動作を実装するために使用できます:
var a = ["a", "b", "c"]
var b = ["d", "e", "f"]
let res = [a, b].reduce([],combine:+)
提示されたものの中で最良の代替案(パフォーマンス/メモリに関して)は、単にflatten
、新しい配列構造を作成せずに元の配列を遅延してラップするだけです。
しかし、ことを予告フラット化が 戻らないLazyCollection
怠惰な行動が連鎖(マップ、flatMap、フィルタ、等...)に沿って次の動作に伝播されませんのでこと、。
特定のケースで遅延が理にかなっている場合は、toを先頭に追加または追加する.lazy
ことを忘れないでください。flatten()
たとえば、Tomaszサンプルを次のように変更します。
let c = [a, b].lazy.flatten()
Swift 3.0
加算演算子(+
)を使用して、互換性のあるタイプの2つの既存の配列を加算することにより、新しい配列を作成できます。新しい配列のタイプは、一緒に追加する2つの配列のタイプから推測されます。
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]
これは上記のコードの正しい結果です。
2つの配列をマージする最も簡単な方法を次に示します。
var array1 = [1,2,3]
let array2 = [4,5,6]
それらを連結/マージする
array1 += array2
New value of array1 is [1,2,3,4,5,6]
同様に、配列の辞書を使用すると、次のことができます。
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を追加できます。