Swift: реализация Comparable с вычисляемым свойством структуры

Я пытаюсь реализовать сопоставимость в структуре Pitch, у которой есть вычисляемое свойство с именем value. Вычисляемое свойство помечено как «изменяющееся получение», поскольку ему необходимо изменить это свойство экземпляра. Но когда я пытаюсь расширить, чтобы сделать структуру сопоставимой, я получаю сообщение об ошибке рядом со строкой возврата:

Невозможно использовать изменяющийся метод получения для неизменяемого значения: 'lhs' - это константа 'let'

  extension Pitch: Comparable {
    public static func < (lhs: Pitch, rhs: Pitch) -> Bool {
        return lhs.value < rhs.value
    }

Есть идеи, как это исправить, пожалуйста?


person domc    schedule 28.10.2018    source источник
comment
Почему геттер мутирует?   -  person Martin R    schedule 28.10.2018


Ответы (1)


В основном потому, что Mutating изменяет значение переменной внутри объекта.

lhs & rhs  // Are parameter.

И параметр неизменяем (Константы) в Swift.

Поэтому вы можете клонировать эти параметры в новые объекты типа var и использовать их изменяемые Value.

А поскольку они относятся к типу Struct Тип значения, вы можете просто сказать это var newObj = myOldObj.

Ваш код может быть примерно таким.

public static func < (lhs: Pitch, rhs: Pitch) -> Bool {
    var lhsObj = lhs
    var rhsObj = rhs
    return lhsObj.value < rhsObj.value
}
person Mohmmad S    schedule 28.10.2018
comment
lhs и rhs относятся к типу Pitch - person ielyamani; 28.10.2018
comment
@ Carpsen90 отредактировал спасибо: D не заметил, когда я воспроизвел случай - person Mohmmad S; 28.10.2018
comment
Спасибо, Тоби, это работает. По-видимому, создание новых объектов в виде структур должно быть достаточно эффективным. - person domc; 28.10.2018