Swift: влияет на структуру ссылкой или «псевдонимом» переменной - PullRequest
0 голосов
/ 07 мая 2019

Мне нужно обновить структуру, но эта структура нуждается в длинном выражении, которое можно найти в моем viewController:

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

Я хочу изменить одно свойство этой структуры, но не его копию, я хочу обновить его "где он есть", то есть в messageSections []. Msgs []

Проблема здесь в том, что если я попробую этот код после приведенного выше:

theMessage.status = .NOT_SENT 

Будет обновлена ​​только локальная копия, а не настоящая в messageSections []. Msgs []. Поэтому, когда я перезагружаю свой collectionView, ничего не меняется.

Я мог бы сделать

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

Но если мне приходится несколько раз манипулировать этим свойством в своей функции, я не хочу переписывать все выражение каждый раз. Так что я ищу что-то вроде в 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 

В других вопросах я видел, что можно использовать & перед аргументом и inout перед именем параметра, но это только для вызова функций. Я ищу способ создания псевдонима для большого выражения при воздействии на переменную, просто чтобы не переписывать его каждый раз.

1 Ответ

1 голос
/ 07 мая 2019

Вы можете использовать firstIndex, чтобы получить индекс элемента в массиве, а затем получить доступ к элементу напрямую, используя полученный индекс.

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...