我有这个班级
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
键的值
这怎么可能?
答案 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
在此你:
编辑:在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 }