Vraag Zoek een item en verander de waarde in aangepaste objectarray - Swift


Ik heb deze klas

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

    }
}

En ik gebruik het zo

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

Voeg item toe

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

Ik wil de index vinden door eventID sleutel en verander de waarde van added sleutel in dezelfde index

Hoe is dat mogelijk?


10
2018-06-28 19:09


oorsprong


antwoorden:


Gebruik filter en eerst om de waarde te vinden:

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

Hierin:

  1. filter de array omlaag naar elementen die overeenkomen met de gebeurtenis-ID
  2. kies het eerste resultaat, indien van toepassing
  3. stel vervolgens de waarde in

EDIT: In Swift 3 kun je een paar karakters besparen

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

16
2018-06-28 19:13



Voor mij werkte het bovenstaande antwoord niet. Dus, wat ik deed was eerst de index vinden van het object dat ik wil vervangen en vervolgens de index vervangen door de nieuwe waarde

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

13
2017-10-31 20:59



De filteroperator is niet de beste in dit geval, het werkt voor sommigen van jullie omdat klassen door verwijzing worden doorgegeven.

Uitleg: (U kunt de volgende code in een speeltuin kopiëren als u deze wilt verifiëren).

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

Arrays worden gekopieerd op basis van waarde en niet op verwijzing, dus wanneer u filter gebruikt, maakt u een nieuwe array (anders dan de initiaal), maar wanneer u de nieuwe wijzigt, wordt ook de eerste gewijzigd, omdat beide verwijzen naar dezelfde klasse ( geklasseerd worden doorgegeven door verwijzing), dus na het filter is uw array veranderd en is de nieuwe toegewezen. Dus in dit geval wordt het afgedrukt "standaard "," standaard " en dan "standaard," gewijzigd ".

Wat gebeurt er als je verandert? class voor struct, de waarde wordt doorgegeven door de waarde niet-referentie, dus je zult 2 matrices in het geheugen hebben met verschillende waarden, dus als je doorgaat arrayBooks opnieuw wordt het vóór het filter afgedrukt "Default", "default", en dan "standaard", "standaard" nog een keer. Omdat u bij het gebruik van het filter een nieuwe array maakt en wijzigt die wordt verwijderd als u deze niet opslaat).

De oplossing is kaart gebruiken, een nieuwe array maken met alle waarden maar met de gewijzigde items of velden die we willen en dan onze array vervangen door de nieuwe. Dit wordt afgedrukt "standaard", "standaard" voor de kaart en dan "standaard", "gewijzigd"

Dit zal werken met structs, classes en alles wat je wilt :).

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

6
2018-03-27 13:31