Bagaimana saya membuat duplikat yang tepat dari sebuah array?
Saya mengalami kesulitan menemukan informasi tentang menduplikasi array di Swift.
Saya mencoba menggunakan .copy()
var originalArray = [1, 2, 3, 4]
var duplicateArray = originalArray.copy()
var duplicateArray = originalArray
Jawaban:
Array memiliki semantik nilai penuh di Swift, jadi tidak perlu sesuatu yang mewah.
var duplicateArray = originalArray
adalah semua yang Anda butuhkan.Jika konten array Anda adalah tipe referensi, maka ya, ini hanya akan menyalin pointer ke objek Anda. Untuk melakukan salinan mendalam dari konten, Anda akan menggunakan
map
dan melakukan salinan dari setiap contoh. Untuk kelas Foundation yang sesuai denganNSCopying
protokol, Anda dapat menggunakancopy()
metode ini:Perhatikan bahwa ada masalah di sini yang semantik nilai Swift bekerja untuk melindungi Anda dari — misalnya, karena
NSArray
mewakili larik yang tidak dapat diubah,copy
metodenya hanya mengembalikan referensi ke dirinya sendiri, sehingga pengujian di atas akan menghasilkan hasil yang tidak terduga.sumber
var x = [UIView(), UIView(), UIView()] var y = x for i in x { NSLog("%p", i) } println("---") for i in y { NSLog("%p", i) }
dan saya mendapatkan output ini:0x7fa82b0009e0 0x7fa82b012660 0x7fa82b012770 ---0x7fa82b0009e0 0x7fa82b012660 0x7fa82b012770
Sepertinya tidak disalin, tahukah Anda mengapa?x[0] == x[1]
tetapix[0] === y[0]
harus gagalNate benar. Jika Anda bekerja dengan array primitif, yang perlu Anda lakukan adalah menetapkan duplikatArray ke originalArray.
Demi kelengkapan, jika Anda mengerjakan objek NSArray, Anda akan melakukan hal berikut untuk melakukan salinan lengkap NSArray:
sumber
Ada pilihan ketiga untuk jawaban Nate:
* DIEDIT * pengeditan dimulai di sini
Di atas pada dasarnya sama seperti di bawah ini dan sebenarnya menggunakan operator persamaan di bawah ini akan bekerja lebih baik karena array tidak akan disalin kecuali diubah (ini sesuai desain).
Baca lebih lanjut di sini: https://developer.apple.com/swift/blog/?id=10
* DIEDIT * edit berakhir di sini
menambahkan atau menghapus ke array ini tidak akan mempengaruhi array asli. Namun, mengubah setiap properti objek yang dipegang oleh array akan terlihat dalam array asli. Karena objek dalam array bukan salinan (dengan asumsi array menampung objek, bukan angka primitif).
sumber
var array1: [String] = ["john", "alan", "kristen"]; print(array1); var array2 = array1.map { $0 }; print(array2); array2[0] = "james"; print(array1); print(array2);
NSCopying
, maka duplikat sebuah array:let z = x.map { $0.copy as! ClassX }
Untuk objek normal yang bisa dilakukan adalah mengimplementasikan protokol yang mendukung penyalinan, dan membuat kelas objek mengimplementasikan protokol ini seperti ini:
Dan kemudian ekstensi Array untuk kloning:
dan hanya itu saja, untuk melihat kode dan contoh, periksa intinya
sumber
object's
fungsi initJika Anda ingin menyalin item dari array dari beberapa objek kelas. Kemudian Anda dapat mengikuti kode di bawah ini tanpa menggunakan protokol NSCopying tetapi Anda harus memiliki metode init yang harus mengambil semua parameter yang diperlukan untuk objek Anda. Berikut adalah kode untuk contoh untuk diuji di taman bermain.
sumber