Dans mon application, j'ai utilisé tableview. J'ai ajouté un objet dans un tableau lorsque vous sélectionnez une cellule, puis désélectionnez et supprimez un objet lorsque vous sélectionnez à nouveau une cellule. J'ai utilisé ce code mais donnez-moi une erreur. Aidez-moi, s'il vous plaît
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
let cell = tableView.cellForRow(at: indexPath as IndexPath) as? ConctactsCell
cell?.imgCheckMark.image = UIImage(named:"check_mark")
arrContacts.append(contacts[indexPath.row] )
NSLog("selected code = %@",arrContacts);
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath as IndexPath) as? ConctactsCell
cell?.imgCheckMark.image = UIImage(named:"")
arrContacts.removeObject(contacts[indexPath.row])
}
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)
}
}
}
Ça me donne 3 erreur comme ça
Declaration is only valid at file scope
C-style for statement has been removed in Swift 3
Value of type '[Any]' has no member 'removeObject'
Swift (3) équivalent à NSMutableArray
's removeObject
est:
var array = ["alpha", "beta", "gamma"]
if let index = array.index(of:"beta") {
array.remove(at: index)
}
si les objets sont uniques. Il n'est pas du tout nécessaire de transtyper en NSArray
et d'utiliser indexOfObject:
S'il existe plusieurs occurrences du même objet, utilisez filter
. Toutefois, dans les cas tels que les tableaux de sources de données où un index est associé à un objet particulier, index(of
est préférable car il est plus rapide que filter
.
Mettre à jour:
Dans Swift 4.2+, vous pouvez supprimer une ou plusieurs occurrences de beta
avec removeAll
:
array.removeAll{$0 == "beta"}
var a = ["one", "two", "three", "four", "five"]
// Remove/filter item with value 'three'
a = a.filter { $0 != "three" }
Pour Swift 3, vous pouvez utiliser index (où :) et inclure une fermeture permettant de comparer un objet du tableau ($ 0) à celui que vous recherchiez.
var array = ["alpha", "beta", "gamma"]
if let index = array.index(where: {$0 == "beta"}) {
array.remove(at: index)
}
Une autre solution intéressante et utile consiste à créer ce type d’extension:
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
}
}
De cette façon, si vous avez votre tableau avec des objets personnalisés:
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)
for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object)
est pour la boucle dans le style C et a été supprimé
Changez votre code en quelque chose comme ceci pour supprimer tous les objets similaires s'il a été mis en boucle:
let indexes = arrContacts.enumerated().filter { $0.element == contacts[indexPath.row] }.map{ $0.offset }
for index in indexes.reversed() {
arrContacts.remove(at: index)
}
Dans Swift 3, utilisez cette Extension
:
extension Array where Element: Equatable{
mutating func remove (element: Element) {
if let i = self.index(of: element) {
self.remove(at: i)
}
}
}
exemple:
var array = ["alpha", "beta", "gamma"]
array.remove(element: "beta")
Swift 4
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
if let index = students.firstIndex(where: { $0.hasPrefix("A") }) {
students.remove(at: index)
}
La solution correcte et efficace pour supprimer un objet unique (nommé "objectToRemove") d'un tableau de ces objets (nommé "array") dans Swift 3 est la suivante:
if let index = array.enumerated().filter( { $0.element === objectToRemove }).map({ $0.offset }).first {
array.remove(at: index)
}
Essayez ceci dans Swift 3
array.remove(at: Index)
Au lieu de
array.removeAtIndex(index)
Mettre à jour
"Declaration is only valid at file scope".
Assurez-vous que l'objet est dans la portée. Vous pouvez donner la portée "interne", qui est la valeur par défaut.
index(of:<Object>)
pour fonctionner, la classe doit être conforme à Equatable
Dans Swift 3 et 4
var array = ["a", "b", "c", "d", "e", "f"]
for (index, element) in array.enumerated().reversed() {
array.remove(at: index)
}
De Swift 4.2 , vous pouvez utiliser une approche plus avancée (plus rapide et plus efficace en termes de mémoire)
array.removeAll(where: { $0 == "c" })
au lieu de
array = array.filter { !$0.hasPrefix("c") }
Lire la suite ici
Extension pour array pour le faire facilement et permettre l'enchaînement:
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
}
}
C'est la réponse officielle pour trouver l'index d'un objet spécifique, alors vous pouvez facilement supprimer n'importe quel objet utilisant cet index:
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"]
Voici le lien: https://developer.Apple.com/documentation/Swift/array/2994720-firstindex