[AnyObect]? tidak identik dengan CGFloat. Saat bergabung ke array AnyObject.
khunshan
6
Khunshan: AnyObjectmenunjukkan objek, yang seperti yang saya mengerti berarti sesuatu yang dipakai dari tipe kelas. CGFloatbukan objek, ini adalah nilai skalar. Seperti yang saya pahami, array dapat mengandung skalar, kecuali jika didefinisikan sebagai mengandung AnyObjectatau disempurnakan lebih lanjut. Namun, saya curiga di sini masalahnya adalah bahwa array dibungkus dengan opsional, jadi Anda harus membukanya dengan !atau ?pertama.
Owen Godfrey
Apakah kita tahu apakah kecerdasan Swift 2 Copy-On-Write meluas untuk menentukan apakah bbagian ayang dimodifikasi (karena itu mungkin memilih salinan bselama a.appendContentsOf(b))?
Ephemera
1
@WenGodfrey terima kasih. saya punya sedikit kebingungan atas appendContentsOf dan insertContentsOf.
Kode sampel Playground berikut ini menunjukkan cara menggabungkan dua array tipe [Int]ke array baru menggunakan flatMap(_:)metode:
let array1=[1,2,3]let array2=[4,5,6]let flattenArray =[array1, array2].flatMap({(element:[Int])->[Int]inreturn element
})
print(flattenArray)// prints [1,2,3,4,5,6]
# 5 Menggabungkan dua array ke array baru dengan Sequence's joined()metode dan Array' sinit(_:) initializer
Swift menyediakan joined()metode untuk semua jenis yang sesuai dengan Sequenceprotokol (termasuk Array). joined()memiliki deklarasi berikut :
Mengembalikan elemen dari urutan urutan ini, disatukan.
func joined()->FlattenSequence<Self>
Selain itu, Swift Arraymemiliki init(_:)inisialisasi. init(_:)memiliki deklarasi berikut :
Membuat array berisi elemen-elemen dari suatu urutan.
init<S>(_ s: S)whereElement== S.Element, S :Sequence
Oleh karena itu, kode sampel Playground berikut menunjukkan cara menggabungkan dua array tipe [Int]ke array baru menggunakan joined()metode dan init(_:)penginisialisasi:
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. Menggabungkan dua array ke array baru dengan Array'sreduce(_:_:) metode
Swift Arraypunya reduce(_:_:)metode. reduce(_:_:)memiliki deklarasi berikut :
Mengembalikan hasil menggabungkan elemen-elemen dari urutan menggunakan penutupan yang diberikan.
Kode Playground berikut menunjukkan cara menggabungkan dua array tipe [Int]ke array baru menggunakan reduce(_:_:)metode:
let array1=[1,2,3]let array2=[4,5,6]let flattenArray =[array1, array2].reduce([],{(result:[Int], element:[Int])->[Int]inreturn result + element
})
print(flattenArray)// prints [1,2,3,4,5,6]
terima kasih telah berbagi kode ini, penjelasan yang baik, hanya saran untuk jawaban Anda, akan lebih baik, jika Anda mengatakan yang mana yang lebih efisien dengan kinerja?
kokemomuke
Saya suka +untuk 2 array dan joined()untuk array array.
Cœur
Jika Anda menggabungkan lebih dari 2 array (atau string atau apa pun), menahan diri dari menggunakan +operator, itu menghasilkan waktu kompilasi yang benar-benar gila.
Lawicko
@ lawicko metode apa yang akan Anda rekomendasikan?
CyberMew
@CyberMew Apa pun yang tidak menggunakan operator kelebihan beban, saya suka metode # 3 karena saya pikir itu paling mudah dibaca, tapi saya juga suka metode # 4 dengan peta datar. Untuk string saya suka metode # 5 karena pada akhirnya Anda mendapatkan string yang bergabung segera.
lawicko
34
Jika Anda bukan penggemar berat overloading operator, atau hanya lebih dari tipe fungsional:
// 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]
var a:[CGFloat]=[1,2,3]var b:[CGFloat]=[4,5,6]let c =[a, b].flatten()
Ini akan kembali FlattenBidirectionalCollectionjadi jika Anda hanya menginginkan CollectionTypeini akan cukup dan Anda akan memiliki evaluasi malas secara gratis. Jika Anda benar-benar membutuhkan Array, Anda dapat melakukan ini:
flatten()sepertinya tidak ada lagi saat ini. Tetapi Anda dapat mempertimbangkan joined().
Cœur
13
Untuk melengkapi daftar alternatif yang memungkinkan, reducedapat digunakan untuk menerapkan perilaku perataan :
var a =["a","b","c"]var b =["d","e","f"]let res =[a, b].reduce([],combine:+)
Alternatif terbaik (kinerja / memori-bijaksana) di antara yang disajikan adalah sederhana flatten, yang hanya membungkus array asli dengan malas tanpa membuat struktur array baru.
Tetapi perhatikan bahwa perataan tidak mengembalikan aLazyCollection , sehingga perilaku malas tidak akan disebarkan ke operasi berikutnya di sepanjang rantai (peta, flatMap, filter, dll ...).
Jika lazyness masuk akal dalam kasus tertentu, hanya ingat untuk tambahkan atau menambahkan sebuah .lazyuntuk flatten(), misalnya, memodifikasi Tomasz sampel dengan cara ini:
Anda dapat membuat array baru dengan menambahkan bersama dua array yang ada dengan tipe yang kompatibel dengan operator tambahan ( +). Jenis array baru disimpulkan dari jenis dua array yang Anda tambahkan bersama,
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]
Jawaban:
Anda dapat menggabungkan array dengan
+
, membangun array baruatau menambahkan satu array ke array lainnya dengan
+=
(atauappend
):sumber
AnyObject
menunjukkan objek, yang seperti yang saya mengerti berarti sesuatu yang dipakai dari tipe kelas.CGFloat
bukan objek, ini adalah nilai skalar. Seperti yang saya pahami, array dapat mengandung skalar, kecuali jika didefinisikan sebagai mengandungAnyObject
atau disempurnakan lebih lanjut. Namun, saya curiga di sini masalahnya adalah bahwa array dibungkus dengan opsional, jadi Anda harus membukanya dengan!
atau?
pertama.b
bagiana
yang dimodifikasi (karena itu mungkin memilih salinanb
selamaa.appendContentsOf(b)
)?Dengan Swift 5, sesuai dengan kebutuhan Anda, Anda dapat memilih salah satu dari enam cara berikut untuk menggabungkan / menggabungkan dua array.
# 1. Menggabungkan dua array ke array baru dengan
Array
's+(_:_:)
Operator generikArray
memiliki+(_:_:)
operator generik.+(_:_:)
memiliki deklarasi berikut :Kode sampel Playground berikut menunjukkan cara menggabungkan dua array tipe
[Int]
ke array baru menggunakan+(_:_:)
operator generik:# 2. Menambahkan elemen array ke array yang ada dengan
Array
's+=(_:_:)
Operator generikArray
memiliki+=(_:_:)
operator generik.+=(_:_:)
memiliki deklarasi berikut :Kode sampel Playground berikut menunjukkan cara menambahkan elemen dari array tipe
[Int]
ke array yang ada menggunakan+=(_:_:)
operator generik:# 3. Menambahkan array ke array yang lain dengan
Array
'sappend(contentsOf:)
metodeSwift
Array
punyaappend(contentsOf:)
metode.append(contentsOf:)
memiliki deklarasi berikut :Kode sampel Playground berikut menunjukkan cara menambahkan array ke array tipe lain
[Int]
menggunakanappend(contentsOf:)
metode:# 4 Menggabungkan dua array ke array baru dengan
Sequence
'sflatMap(_:)
metodeSwift menyediakan
flatMap(_:)
metode untuk semua jenis yang sesuai denganSequence
protokol (termasukArray
).flatMap(_:)
memiliki deklarasi berikut :Kode sampel Playground berikut ini menunjukkan cara menggabungkan dua array tipe
[Int]
ke array baru menggunakanflatMap(_:)
metode:# 5 Menggabungkan dua array ke array baru dengan
Sequence
'sjoined()
metode danArray
' sinit(_:)
initializerSwift menyediakan
joined()
metode untuk semua jenis yang sesuai denganSequence
protokol (termasukArray
).joined()
memiliki deklarasi berikut :Selain itu, Swift
Array
memilikiinit(_:)
inisialisasi.init(_:)
memiliki deklarasi berikut :Oleh karena itu, kode sampel Playground berikut menunjukkan cara menggabungkan dua array tipe
[Int]
ke array baru menggunakanjoined()
metode daninit(_:)
penginisialisasi:# 6. Menggabungkan dua array ke array baru dengan
Array
'sreduce(_:_:)
metodeSwift
Array
punyareduce(_:_:)
metode.reduce(_:_:)
memiliki deklarasi berikut :Kode Playground berikut menunjukkan cara menggabungkan dua array tipe
[Int]
ke array baru menggunakanreduce(_:_:)
metode:sumber
+
untuk 2 array danjoined()
untuk array array.+
operator, itu menghasilkan waktu kompilasi yang benar-benar gila.Jika Anda bukan penggemar berat overloading operator, atau hanya lebih dari tipe fungsional:
sumber
Metode favorit saya sejak Swift 2.0 rata
Ini akan kembali
FlattenBidirectionalCollection
jadi jika Anda hanya menginginkanCollectionType
ini akan cukup dan Anda akan memiliki evaluasi malas secara gratis. Jika Anda benar-benar membutuhkan Array, Anda dapat melakukan ini:sumber
flatten()
sepertinya tidak ada lagi saat ini. Tetapi Anda dapat mempertimbangkanjoined()
.Untuk melengkapi daftar alternatif yang memungkinkan,
reduce
dapat digunakan untuk menerapkan perilaku perataan :Alternatif terbaik (kinerja / memori-bijaksana) di antara yang disajikan adalah sederhana
flatten
, yang hanya membungkus array asli dengan malas tanpa membuat struktur array baru.Tetapi perhatikan bahwa perataan tidak mengembalikan a
LazyCollection
, sehingga perilaku malas tidak akan disebarkan ke operasi berikutnya di sepanjang rantai (peta, flatMap, filter, dll ...).Jika lazyness masuk akal dalam kasus tertentu, hanya ingat untuk tambahkan atau menambahkan sebuah
.lazy
untukflatten()
, misalnya, memodifikasi Tomasz sampel dengan cara ini:sumber
Jika Anda ingin array kedua dimasukkan setelah indeks tertentu, Anda dapat melakukan ini (pada Swift 2.2):
sumber
Swift 3.0
Anda dapat membuat array baru dengan menambahkan bersama dua array yang ada dengan tipe yang kompatibel dengan operator tambahan (
+
). Jenis array baru disimpulkan dari jenis dua array yang Anda tambahkan bersama,ini adalah hasil yang benar dari kode di atas.
sumber
jika Anda ingin hasilnya sebagai: [1,2,3, [4,5,6]]
kode di atas akan mengonversi arrayOne sebagai elemen tunggal dan menambahkannya ke akhir arrayTwo.
jika Anda ingin hasilnya sebagai: [1, 2, 3, 4, 5, 6] maka,
kode di atas akan menambahkan semua elemen arrayOne di akhir arrayTwo.
Terima kasih.
sumber
Swift 4.X
Cara termudah yang saya tahu adalah dengan hanya menggunakan tanda +
sumber
Inilah cara terpendek untuk menggabungkan dua array.
Menggabungkan / menggabungkan mereka
sumber
Demikian pula, dengan kamus array, orang dapat:
dan Anda dapat mengulangi dict1 dan menambahkan dict2 jika "kunci" cocok
sumber
Marge array yang merupakan tipe data yang berbeda:
Keluaran:
sumber