Jerem Lachkar
Jerem Lachkar

Reputation: 1197

Swift : affect struct by reference or "alias" to a variable

I have to update a struct, but this struct needs a long expression to be found from my viewController :

let theMessage:Message? = self.messageSections.first(where: { $0.date == DateDMY(fromNSDate:msg.date) })?
        .msgs.first(where: { $0 == msg })

I want to mutate one property of this struct, but not a copy of it, I want to update it "where it is", that is in messageSections[].msgs[]

The problem here is that if I try this code after the one above :

theMessage.status = .NOT_SENT 

Only the local copy will be updated, and not the real one in messageSections[].msgs[]. So when I reload my collectionView, nothing changes.

I could do

self.messageSections.first(where: { $0.date == DateDMY(fromNSDate:msg.date) })?
        .msgs.first(where: { $0 == msg }).status = .NOT_SENT

But if I have to manipulate this property several times in my function, I dont want to re-write the whole expression each time. So what I'm looking for is something like in C :

let theMessage:Message?* = &self.messageSections.first(where: { $0.date == DateDMY(fromNSDate:msg.date) })?
    .msgs.first(where: { $0 == msg })
if(theMessage != NULL) 
    theMessage->status = .NOT_SENT 

I saw in other questions that I could use & before argument and inout before parameter name, but its only for functions calling. I'm looking for a way to create an alias for a big expression when affecting a variable, just to avoid re-writting it each time.

Upvotes: 0

Views: 211

Answers (1)

David Pasztor
David Pasztor

Reputation: 54716

You can use firstIndex to get the index of the element in the array, then access the element directly using the retrieved index.

if let messageSectionIndex = self.messageSections.first(where: { $0.date == DateDMY(fromNSDate:msg.date) }), let messageIndex = self.messageSections[messageSectionIndex].msgs.firstIndex(where: { $0 == msg }) {
    self.messageSections[messageSectionIndex].msgs[messageIndex].status = .NOT_SENT
}

Upvotes: 1

Related Questions