ios - initialize - swift dictionary array




Removendo objeto da matriz no Swift 3 (8)

  1. for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) é para loop no estilo C e foi removido

  2. Altere seu código para algo como isto para remover todos os objetos semelhantes se ele tiver sido colocado em loop:

    let indexes = arrContacts.enumerated().filter { $0.element == contacts[indexPath.row] }.map{ $0.offset }
    for index in indexes.reversed() {
       arrContacts.remove(at: index)
    }

Na minha aplicação eu adicionei um objeto na matriz quando selecione celular e desmarque e remova o objeto quando selecionar novamente a célula. Eu usei esse código, mas me dê erro.

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])
    }
}

Isso me dá 2 erros assim:

C-style for statement has been removed in Swift 3
Value of type '[Any]' has no member 'removeObject'

A solução correta e funcional de uma linha para excluir um objeto exclusivo (chamado "objectToRemove") de uma matriz desses objetos (denominada "matriz") no Swift 3 é:

if let index = array.enumerated().filter( { $0.element === objectToRemove }).map({ $0.offset }).first {
   array.remove(at: index)
}

Esta é a resposta oficial para encontrar o índice do objeto específico, então você pode facilmente remover qualquer objeto usando esse índice:

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"]

Aqui está o link: https://developer.apple.com/documentation/swift/array/2994720-firstindex


Extensão para matriz para fazer isso facilmente e permitir o encadeamento:

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
    }
}

O Swift equivalente ao removeObject NSMutableArray é:

var array = ["alpha", "beta", "gamma"]

if let index = array.firstIndex(of: "beta") {
    array.remove(at: index)
}

se os objetos forem exclusivos . Não há necessidade de converter para o NSArray e usar indexOfObject:

O index(of: API index(of: também funciona, mas isso causa uma ponte implícita desnecessária para o NSArray .

Se houver várias ocorrências do mesmo objeto use filter . No entanto, em casos como arrays de fontes de dados em que um índice está associado a um objeto específico, firstIndex(of é preferível porque é mais rápido que o filter .

Atualizar:

No Swift 4.2+ você pode remover uma ou várias ocorrências de beta com removeAll(where:) :

array.removeAll{$0 == "beta"}

Outra solução interessante e útil é criar esse tipo de extensão:

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
    }

}

Dessa forma, se você tiver sua matriz com objetos personalizados:

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) 

Tente isso no Swift 3

array.remove(at: Index)

Ao invés de

array.removeAtIndex(index)

Atualizar

"Declaration is only valid at file scope".

Certifique-se de que o objeto esteja no escopo. Você pode dar o escopo "interno", que é o padrão.

index(of:<Object>) para trabalhar, a classe deve estar em conformidade com o Equatable


Swift 4

var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]

if let index = students.firstIndex(where: { $0.hasPrefix("A") }) {
   students.remove(at: index)
}




swift3