在Swift 3中从数组中删除对象

Kam*_*iya 63 arrays ios swift swift3

在我的应用程序中,我在选择单元格时在数组中添加了一个对象,并在重新选择单元格时取消选择并删除对象.我使用了那段代码但是给了我错误.

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])
    }
}
Run Code Online (Sandbox Code Playgroud)

它给了我2个错误:

C-style for statement has been removed in Swift 3
Value of type '[Any]' has no member 'removeObject'
Run Code Online (Sandbox Code Playgroud)

vad*_*ian 123

迅(3)等效于NSMutableArrayremoveObject是:

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

if let index = array.firstIndex(of: "beta") {
    array.remove(at: index)
}
Run Code Online (Sandbox Code Playgroud)

如果对象是唯一的.根本不需要投射NSArray和使用indexOfObject:

如果有多次出现相同的对象使用index(of:.但是,在数据源数组中,索引与特定对象关联NSArray的情况更可取,因为它比它更快filter.

更新:

在斯威夫特4.2+你可以删除一个或多次出现firstIndex(offilter:

array.removeAll{$0 == "beta"}
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,但是没有删除(对象:"beta")是愚蠢的. (28认同)
  • 我认为`.index(of:`仅在集合包含`Equatable`类型时才可用. (5认同)

nyx*_*xee 65

var a = ["one", "two", "three", "four", "five"]

// Remove/filter item with value 'three'
a = a.filter { $0 != "three" }
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的Swift解决方案,它利用了语言提供的语法功能. (6认同)

Mar*_*sel 23

对于Swift 3,您可以使用index(where :)并包含一个闭包,用于比较数组中的对象($ 0)与您要查找的内容.

var array = ["alpha", "beta", "gamma"]
if let index = array.index(where: {$0 == "beta"}) {
  array.remove(at: index)
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*nzo 16

另一个不错的有用解决方案是创建这种扩展:

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
    }

}
Run Code Online (Sandbox Code Playgroud)

这样,如果您的数组包含自定义对象:

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) 
Run Code Online (Sandbox Code Playgroud)


Tj3*_*j3n 5

  1. for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) 是C风格的循环,已被删除

  2. 将代码更改为类似于删除所有类似对象(如果已循环):

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


Ser*_* Di 5

雨燕4

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

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


Moh*_*asm 5

在Swift 3中,使用以下命令Extension

extension Array where Element: Equatable{
    mutating func remove (element: Element) {
        if let i = self.index(of: element) {
            self.remove(at: i)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

var array = ["alpha", "beta", "gamma"]
array.remove(element: "beta")
Run Code Online (Sandbox Code Playgroud)