Dalam aplikasi saya, saya menambahkan satu objek dalam array ketika memilih sel dan membatalkan pilihan dan menghapus objek saat memilih ulang sel. Saya menggunakan kode itu tetapi memberi saya kesalahan.
extension Array {
func indexOfObject(object : AnyObject) -> NSInteger {
return (self as NSArray).indexOfObject(object)
}
mutating func removeObject(object : AnyObject) {
for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) {
self.removeAtIndex(index)
}
}
}
class MyViewController: UITableViewController {
var arrContacts: [Any] = []
var contacts: [Any] = []
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
arrContacts.removeObject(contacts[indexPath.row])
}
}
Ini memberi saya 2 kesalahan seperti itu:
C-style for statement has been removed in Swift 3
Value of type '[Any]' has no member 'removeObject'
Set<Contact>
daripada Array. Dapatkah Anda memberikan lebih banyak informasi tentang objek kontak Anda? Jika Anda membuatnya sendiri, Anda akan membutuhkannya untuk menyesuaikanHashable
danEquatable
untuk meletakkannya dalam satu setJawaban:
Persamaan Swift dengan
NSMutableArray
'sremoveObject
adalah:var array = ["alpha", "beta", "gamma"] if let index = array.firstIndex(of: "beta") { array.remove(at: index) }
jika objeknya unik . Tidak perlu sama sekali untuk mentransmisikan
NSArray
dan menggunakanindexOfObject:
API
index(of:
juga berfungsi tetapi hal ini menyebabkan transmisi implisit yang tidak perlu dilakukanNSArray
.Jika ada beberapa kejadian penggunaan objek yang sama
filter
. Namun dalam kasus seperti larik sumber data di mana indeks dikaitkan dengan objek tertentufirstIndex(of
lebih disukai karena lebih cepat daripadafilter
.Memperbarui:
Di Swift 4.2+ Anda dapat menghapus satu atau beberapa kejadian
beta
denganremoveAll(where:)
:array.removeAll{$0 == "beta"}
sumber
.index(of:
hanya tersedia jika koleksi berisiEquatable
jenis.while let index = array.index(of: "beta") { array.remove(at: index) }
filter
solusi. Tetapi jika objeknya unik, gunakan selaluindex(of
karena performanya jauh lebih baik daripadafilter
var a = ["one", "two", "three", "four", "five"] // Remove/filter item with value 'three' a = a.filter { $0 != "three" }
sumber
Untuk Swift 3, Anda dapat menggunakan index (di mana :) dan menyertakan closure yang melakukan perbandingan objek dalam array ($ 0) dengan apa pun yang Anda cari.
var array = ["alpha", "beta", "gamma"] if let index = array.index(where: {$0 == "beta"}) { array.remove(at: index) }
sumber
Solusi bagus dan berguna lainnya adalah dengan membuat ekstensi semacam ini:
extension Array where Element: Equatable { @discardableResult mutating func remove(object: Element) -> Bool { if let index = index(of: object) { self.remove(at: index) return true } return false } @discardableResult mutating func remove(where predicate: (Array.Iterator.Element) -> Bool) -> Bool { if let index = self.index(where: { (element) -> Bool in return predicate(element) }) { self.remove(at: index) return true } return false } }
Dengan cara ini, jika Anda memiliki array Anda dengan objek kustom:
let obj1 = MyObject(id: 1) let obj2 = MyObject(id: 2) var array: [MyObject] = [obj1, obj2] array.remove(where: { (obj) -> Bool in return obj.id == 1 }) // OR array.remove(object: obj2)
sumber
remove(element: Element)
karena dalam Array Anda juga dapat menyimpan tipe seperti Int, Double - mereka bukan objek.Di Swift 5 , Gunakan ini
Extension
:extension Array where Element: Equatable{ mutating func remove (element: Element) { if let i = self.firstIndex(of: element) { self.remove(at: i) } } }
contoh:
var array = ["alpha", "beta", "gamma"] array.remove(element: "beta")
Di Swift 3 , Gunakan ini
Extension
:extension Array where Element: Equatable{ mutating func remove (element: Element) { if let i = self.index(of: element) { self.remove(at: i) } } }
contoh:
var array = ["alpha", "beta", "gamma"] array.remove(element: "beta")
sumber
for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object)
adalah untuk loop dalam gaya C dan telah dihapusUbah kode Anda menjadi sesuatu seperti ini untuk menghapus semua objek serupa jika telah berulang:
let indexes = arrContacts.enumerated().filter { $0.element == contacts[indexPath.row] }.map{ $0.offset } for index in indexes.reversed() { arrContacts.remove(at: index) }
sumber
Cepat 4
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"] if let index = students.firstIndex(where: { $0.hasPrefix("A") }) { students.remove(at: index) }
sumber
Solusi satu baris yang benar dan berfungsi untuk menghapus objek unik (bernama "objectToRemove") dari array objek ini (bernama "array") di Swift 3 adalah:
if let index = array.enumerated().filter( { $0.element === objectToRemove }).map({ $0.offset }).first { array.remove(at: index) }
sumber
Coba ini di Swift 3
array.remove(at: Index)
Dari pada
Memperbarui
"Declaration is only valid at file scope".
Pastikan objek dalam ruang lingkup. Anda dapat memberikan ruang lingkup "internal", yang default.
index(of:<Object>)
untuk bekerja, kelas harus sesuaiEquatable
sumber
Di Swift 3 dan 4
var array = ["a", "b", "c", "d", "e", "f"] for (index, element) in array.enumerated().reversed() { array.remove(at: index) }
Dari Swift 4.2 Anda dapat menggunakan pendekatan yang lebih canggih (lebih cepat dan hemat memori)
array.removeAll(where: { $0 == "c" })
dari pada
array = array.filter { !$0.hasPrefix("c") }
Baca lebih lanjut di sini
sumber
Ekstensi untuk array untuk melakukannya dengan mudah dan memungkinkan perangkaian untuk Swift 4.2 dan yang lebih baru:
public extension Array where Element: Equatable { @discardableResult public mutating func remove(_ item: Element) -> Array { if let index = firstIndex(where: { item == $0 }) { remove(at: index) } return self } @discardableResult public mutating func removeAll(_ item: Element) -> Array { removeAll(where: { item == $0 }) return self } }
sumber
Ini adalah jawaban resmi untuk mencari indeks objek tertentu, maka Anda dapat dengan mudah menghapus objek apa pun menggunakan indeks itu:
var students = ["Ben", "Ivy", "Jordell", "Maxime"] if let i = students.firstIndex(of: "Maxime") { // students[i] = "Max" students.remove(at: i) } print(students) // Prints ["Ben", "Ivy", "Jordell"]
Ini tautannya: https://developer.apple.com/documentation/swift/array/2994720-firstindex
sumber
Ini yang saya gunakan (Swift 5) ...
extension Array where Element:Equatable { @discardableResult mutating func removeFirst(_ item:Any ) -> Any? { for index in 0..<self.count { if(item as? Element == self[index]) { return self.remove(at: index) } } return nil } @discardableResult mutating func removeLast(_ item:Any ) -> Any? { var index = self.count-1 while index >= 0 { if(item as? Element == self[index]) { return self.remove(at: index) } index -= 1 } return nil } } var arrContacts:[String] = ["A","B","D","C","B","D"] var contacts: [Any] = ["B","D"] print(arrContacts) var index = 1 arrContacts.removeFirst(contacts[index]) print(arrContacts) index = 0 arrContacts.removeLast(contacts[index]) print(arrContacts)
Hasil:
["A", "B", "D", "C", "B", "D"] ["A", "B", "C", "B", "D"] ["A", "B", "C", "D"]
Penting: Larik tempat Anda menghapus item harus berisi elemen yang dapat disamakan (seperti objek, string, angka, dll.)
sumber