【问题标题】:Find an item and change value in custom object array - Swift在自定义对象数组中查找项目并更改值 - Swift
【发布时间】:2023-03-18 08:58:01
【问题描述】:

我有这门课

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键找到索引,并在同一索引中更改added键的值

这怎么可能?

【问题讨论】:

    标签: ios arrays swift


    【解决方案1】:
    array = array.map { $0.eventID == id ? newValue : $0 }
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    【解决方案2】:

    如果您的班级符合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)
    

    【讨论】:

      【解决方案3】:

      由于您使用的是,请使用过滤器并首先找到值:

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

      在这个你:

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

      这是有效的,因为类是通过引用传递的。当您编辑来自array.filter({$0.eventID == id}).first? 的返回值时,您将编辑基础值。如果您使用的是 struct

      ,则需要查看以下答案

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

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

      编辑:斯威夫特 4.2:

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

      【讨论】:

      • 或使用该 eventID 执行所有项目:array.filter({$0.eventID == id}).forEach { $0.added = value }
      • 我是唯一一个数组中的值没有通过这种方法更新的人 :( ;(
      • 也不适合我。获取数组不能赋值,$0是不可变的。
      • 如果您的值没有更新,可能您使用的是 Struct 而不是 Class。
      • @binsnoel 使用“类”而不是“结构”。
      【解决方案4】:

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

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

      Swift 5.0 中:

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

      【讨论】:

      • 这是获取索引和替换对象的完美方式。
      • 对我来说,接受的答案也不起作用,只有你的答案起作用。很有帮助!
      【解决方案5】:

      过滤器操作符在这种情况下不是最好的,它对你们中的一些人有用,因为类是通过引用传递的。

      说明:(如果你想验证,可以复制下面的代码在一个playground中)。

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

      数组是按值而不是引用复制的,因此当您使用过滤器时,您正在创建一个新数组(与初始数组不同),但是当您修改新数组时,初始数组也会被修改,因为两者都指向相同的类(分类通过引用传递),因此在过滤器之后,您的数组将发生变化,新的数组将被释放。所以在这种情况下,它将打印“default”、“default”,然后是 “default, “modified”

      如果您将class 更改为struct 会发生什么情况,该值将通过值而不是引用传递,因此您将在内存中拥有两个具有不同值的数组,因此如果您再次通过arrayBooks,它将在之前打印过滤器"default","default",然后再次"default", "default"。因为当您使用过滤器时,您正在创建和修改一个新数组,如果您不存储它将被释放)。

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

      这将适用于结构、类和你想要的一切:)。

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

      【讨论】:

      • 我在 Swift 4.2 上得到相同的结果默认默认值修改
      猜你喜欢
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 2021-01-29
      相关资源
      最近更新 更多