Ответы:
Вы можете объединить массивы с помощью +
создания нового массива.
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, в соответствии с вашими потребностями, вы можете выбрать один из шести следующих способов объединения / объединения двух массивов.
Array
«S +(_:_:)
общего оператора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
«S 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
«S 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
«S 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
«S 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()
для массива массивов.
+
оператора, это приведет к абсолютно безумному времени компиляции.
Если вы не большой поклонник перегрузки операторов или просто более функционального типа:
// 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
этого будет достаточно, и вы будете иметь ленивую оценку бесплатно. Если вам нужен именно Array, вы можете сделать это:
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
лениво оборачивать исходные массивы без создания новой структуры массива.
Но обратите внимание, что сглаживать не возвращается a LazyCollection
, так что ленивое поведение не будет распространяться на следующую операцию по цепочке (map, flatMap, filter и т. Д.).
Если ленивости имеют смысл в вашем конкретном случае, только не забудьте добавить препенд или .lazy
к flatten()
, например, изменение Tomasz Sample следующим образом:
let c = [a, b].lazy.flatten()
Swift 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 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)
Приведенный выше код добавит все элементы arrayOne в конец arrayTwo.
Спасибо.
Вот кратчайший способ объединения двух массивов.
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, если «ключ» совпадает
Массив Marge, которые имеют разные типы данных:
var arrayInt = [Int]()
arrayInt.append(6)
var testArray = ["a",true,3,"b"] as [Any]
testArray.append(someInt)
Вывод :
["a", true, 3, "b", "hi", 3, [6]]