在自定义对象数组中查找项目并更改值 - Swift

时间:2016-06-28 19:09:29

标签: ios arrays swift

我有这个班级

sizeof (int **)

我像这样使用它

class InboxInterests {

    var title = ""
    var eventID = 0
    var count = ""
    var added = 0

    init(title : String, eventID : NSInteger, count: String, added : NSInteger) {
        self.title = title
        self.eventID = eventID
        self.count = count
        self.added = added

    }
}

添加项目

var array: [InboxInterests] = [InboxInterests]()

我希望按let post = InboxInterests(title: "test",eventID : 1, count: "test", added: 0) self.array.append(post) 键找到索引,并在同一索引中更改eventID键的值

这怎么可能?

5 个答案:

答案 0 :(得分:42)

对我来说,上述答案无效。所以,我所做的是首先找到我要替换的对象的索引,然后使用索引将其替换为新值

if let row = self.upcoming.index(where: {$0.eventID == id}) {
       array[row] = newValue
}

答案 1 :(得分:31)

使用过滤器,首先找到值:

array.filter({$0.eventID == id}).first?.added = value

在此你:

  1. 将数组过滤到与事件ID匹配的元素
  2. 选择第一个结果,如果有的话
  3. 然后设置值
  4. 编辑:在Swift 3中,你可以节省几个字符

    array.first({$0.eventID == id})?.added = value
    

    编辑:Swift 4.2:

    array.first(where: { $0.eventID == id })?.added = value
    array.filter {$0.eventID == id}.first?.added = value
    

答案 2 :(得分:12)

在这种情况下,过滤器运算符不是最好的,它适用于某些人,因为类是通过引用传递的。

说明:(如果要验证,可以在操场上复制以下代码。)

class Book {
    let id: Int
    var title = "default"

    init (id: Int) {
        self.id = id
    }
}
var arrayBook = [Book]()
arrayBook.append(Book(id: 0))
arrayBook.append(Book(id:1))
arrayBook.forEach { book in
    print(book.title)
}

arrayBook.filter{ $0.id == 1 }.first?.title = "modified"

arrayBook.forEach { book in
    print(book.title)
}

数组是通过值而不是引用复制的,因此当您使用过滤器时,您正在创建一个新数组(与初始数组不同),但是当您修改新数组时,初始数组也会被修改,因为两者都指向相同的类(通过引用传递分类),因此在过滤器之后,您的数组将发生更改并且新的数组将被取消分配。因此,在这种情况下,它将打印“默认”,“默认”,然后“默认”,“修改”

如果您为class更改struct会发生什么情况,该值将通过值而不是引用传递,因此您将在内存中有2个不同值的数组,因此如果您通过{{1}再次,它将在过滤器“默认”,“默认”之前打印,然后再次“默认”,“默认”。因为当您使用过滤器时,您正在创建和修改一个新阵列,如果您不存储它将被解除分配。)

解决方案是使用map,创建一个包含所有值的新数组,但是使用我们想要的修改项或字段,然后用新的数组替换我们的数组。这将在地图前打印“默认”,“默认”,然后“默认”,“已修改”

这将适用于结构,类和您想要的所有内容:)。

arrayBooks

答案 3 :(得分:1)

如果你的类符合 Equatable 那么这会起作用:

extension Array where Element: Equatable {
    @discardableResult
    public mutating func replace(_ element: Element, with new: Element) -> Bool {
        if let f = self.firstIndex(where: { $0 == element}) {
            self[f] = new
            return true
        }
        return false
    }
}

像这样使用:

array.replace(prev, with: new)

答案 4 :(得分:0)

array = array.map { $0.eventID != eventID ? $0 : newValue }