Изменение значения структуры не имеет никакого эффекта - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть UICollectionView, у которого есть модель со следующим:

class MainVCModel {

    let models = [
        CellModel.init(UIImage.init(named: "1.jpg")!),
        CellModel.init(UIImage.init(named: "2.jpg")!),
        CellModel.init(UIImage.init(named: "3.jpg")!),
        CellModel.init(UIImage.init(named: "4.jpg")!),
        CellModel.init(UIImage.init(named: "5.jpg")!),
        CellModel.init(UIImage.init(named: "6.jpg")!),
        CellModel.init(UIImage.init(named: "7.jpg")!),
        CellModel.init(UIImage.init(named: "8.jpg")!),
        CellModel.init(UIImage.init(named: "9.jpg")!),
    ]
}

struct CellModel {
    var isEnlarged: Bool = false
    var image: UIImage

    lazy var rotatedImage: UIImage = self.image.rotate(radians: Float(Helper.degreesToRadians(degrees: 6)))!

    init(_ image: UIImage){
        self.image = image
    }
}

В моем классе CollectionViewController у меня есть:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        var currentModel = model.models[indexPath.row]
        if !currentModel.isEnlarged {
            print("should enlarge")
            currentModel.isEnlarged = true
            enlargeOnSelection(indexPath)
        }   else {
            print("should restore")
            currentModel.isEnlarged = false
            restoreOnSelection(indexPath)
        }
    }

Но когда я установил currentModel.isEnlarged = true, это не имеет никакого эффекта, оно на самом деле сохраняет значение false, которое я замечаю при отладке. Почему?

Ответы [ 3 ]

2 голосов
/ 11 апреля 2019

В этой строке:

var currentModel = model.models[indexPath.row]

Если models является массивом структуры, currentModel является копией, поэтому установка свойства currentModel не влияет ни на что в массиве.

1 голос
/ 11 апреля 2019

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

currentModel = model.models[indexPath.row]
currentModel.isEnlarged = true
model.models[indexPath.row] = currentModel

Будьте внимательны, чтобы проверить наличие индекса перед добавлением.

1 голос
/ 11 апреля 2019

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

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        var currentModel = model.models[indexPath.row]
        if !currentModel.isEnlarged {
            print("should enlarge")
            model.models[indexPath.row].isEnlarged = true
            enlargeOnSelection(indexPath)
        }   else {
            print("should restore")
            model.models[indexPath.row].isEnlarged = false
            restoreOnSelection(indexPath)
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...