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

Utk*_*maz 28 arrays ios swift

我有这门课

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我就是这样用的

var array: [InboxInterests] = [InboxInterests]()
Run Code Online (Sandbox Code Playgroud)

新增项目

let post = InboxInterests(title: "test",eventID : 1, count: "test", added: 0)
self.array.append(post)
Run Code Online (Sandbox Code Playgroud)

我想eventID按键找到索引并added在同一索引中更改key的值

怎么可能?

Jen*_*ers 57

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

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

  • 这是获取索引和替换对象的完美方式。 (3认同)

Luk*_*uke 36

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

array.filter({$0.eventID == id}).first?.added = value
Run Code Online (Sandbox Code Playgroud)

你在这:

  1. 将数组过滤到与事件ID匹配的元素
  2. 选择第一个结果,如果有的话
  3. 然后设置值

编辑:在Swift 3中,你可以节省几个字符

array.first({$0.eventID == id})?.added = value
Run Code Online (Sandbox Code Playgroud)

编辑:Swift 4.2:

array.first(where: { $0.eventID == id })?.added = value
array.filter {$0.eventID == id}.first?.added = value
Run Code Online (Sandbox Code Playgroud)

  • 或者使用该eventID执行所有项:`array.filter({$ 0.eventID == id}).forEach {$ 0.added = value} (9认同)
  • @binsnoel使用"class"而不是"struct". (6认同)
  • 也不适合我.获取数组不能赋值,$ 0是不可变的. (5认同)
  • 如果您的值没有更新,可能您使用的是Struct而不是Class. (3认同)
  • 我是唯一一个数组中的值没有通过这种方法更新的人吗:(;( (2认同)

Pab*_*mez 15

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

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

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

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

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

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

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

struct 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 = arrayBook.map{
    var mutableBook = $0
    if $0.id == 1 {
        mutableBook.title = "modified"
    }
    return mutableBook
}

arrayBook.forEach { book in
    print(book.title)
}
Run Code Online (Sandbox Code Playgroud)


Suh*_*uho 7

array = array.map { $0.eventID == id ? newValue : $0 }
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码可以回答问题,但提供有关如何和/或为何解决问题的附加上下文将提高​​答案的长期价值。 (9认同)