Не удается использовать отложенный var в struct в методе firstIndex массива

#ios #swift

#iOS #swift

Вопрос:

Я видел пару вопросов, но не нашел решения и причины

Вот структура

 struct MovementFormattedData {
   ... Other properties ...
   lazy var timeAsDate:Date?  = {
       return MovementFormattedData.getUTCDate(movementTime: movementTime)
    }()



  static func getUTCDate(movementTime:String?) -> Date? {
        // return date
     }
}
  

Теперь у меня есть массив

 var movements :[MovementFormattedData] = []
  

Когда я пытаюсь

   self?.movements.firstIndex(where: {$0.timeAsDate > Date() })
  

Я получаю

Невозможно использовать изменяющийся метод получения для неизменяемого значения: ‘$ 0’ является неизменяемым

Я нигде не изменяю 0 долларов. Я просто получаю доступ к свойству

Пожалуйста, помогите

Ответ №1:

Я думаю, что инициализация timeAsDate считается изменяющейся, поэтому отложенная переменная может быть не тем, что вам нужно.

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

 var timeAsDate: Date? {
   return MovementFormattedData.getUTCDate(movementTime: movementTime)
}
  

Комментарии:

1. Спасибо, но я не хочу использовать вычисляемые свойства, я хочу использовать свойство lazy, если вы можете помочь мне с этим?

2. Если вы не используете вычисляемые переменные, вы могли бы сделать это class вместо struct , кроме того, что у меня нет идей, из интереса могу я спросить, почему вы против использования вычисляемых свойств?

3. Предположим, у меня есть 15 тысяч записей, тогда он будет пытаться вычислять каждый раз, когда требуется значение в отличие от lazy, я могу сделать это сохраненным свойством, но я хочу знать причину, по которой это происходит.

4. Причина, по которой он не работает, заключается в том, что инициализация lazy var в основном преобразует его из nil в значение. У меня нет решения, хотя я боюсь

5. Я не могу принять ответ, как ожидалось, потому что это не то, что я ищу, но вы заслуживаете 1

Ответ №2:

Нет необходимости использовать lazy var

 var timeAsDate: Date? {
    return MovementFormattedData.getUTCDate(movementTime: movementTime)
}
  

Комментарии:

1. Спасибо за вашу помощь, но я знаю о вычисляемых свойствах. Я не хочу его использовать, если вы можете помочь мне с этим подходом?

Ответ №3:

свойство lazy изменяет getter, и вы не можете использовать его с $ 0, потому что $ 0 является неизменяемым

смотрите следующий блок кода

 struct MovementFormattedData {
   ... Other properties ...
   var timeAsDate: Date? {
       return MovementFormattedData.getUTCDate(movementTime: movementTime)
    }

  static func getUTCDate(movementTime:String?) -> Date? {
        // return date
     }
}

var movements: [MovementFormattedData] = []

self?.movements.firstIndex(where: { $0.timeAsDate ?? Date() > Date() })