ios - 无法分配给属性 : 'self' is immutable swift error

标签 ios swift properties self

在我的应用程序中,我创建了一个名为“Positions”的协议(protocol),并扩展了 UIView 类以符合该协议(protocol),以便向 UIView 类添加一些属性。我使用了下面的代码。

import Foundation
import UIKit

protocol Positions {
    var initialPositions: [CGRect] {get set}
    var finalPositions: [CGRect] {get set}
    var positionsAreDefined: Bool {get}
}

public enum PositionsType {
    case initial
}

private var initialPositionKey: UInt = 0
private var finalPositionKey: UInt = 0

extension Positions {
    var initialPositions: [CGRect] {
        get {
            if objc_getAssociatedObject(self, &initialPositionKey) != nil {
                return objc_getAssociatedObject(self, &initialPositionKey) as! [CGRect]
            } else {
                return [] as! [CGRect]
            }

        }
        set {
            objc_setAssociatedObject(self, &initialPositionKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }

    var finalPositions: [CGRect] {
        get {
            if objc_getAssociatedObject(self, &finalPositionKey) != nil {
                return objc_getAssociatedObject(self, &finalPositionKey) as! [CGRect]
            } else {
                return [] as! [CGRect]
            }
        }

        set {
            objc_setAssociatedObject(self, &finalPositionKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }

    var positionsAreDefined: Bool {
        get {return initialPositions.count != 0 && finalPositions.count != 0 && initialPositions.count == finalPositions.count}
    }

    var positionsCount: Int {
        get {return initialPositions.count}
    }
}

extension UIView: Positions {}

好吧,今天我尝试使用一种新方法来扩展 UIView 类,该方法更改了我添加的属性,但是编译器在我尝试修改属性值的那一行给了我这个错误:

Cannot assign to property: 'self' is immutable

方法如下:

public func horizontallyInContainer(withShift shift: CGFloat, forExpansionNumber index: Int, forPositionType type: PositionsType) {
    if self.positionsAreDefined && self.superview != nil {
        if type == .initial {

            var newPositions = self.initialPositions
            newPositions[index].origin.x = self.superview!.bounds.width * 0.5 - self.bounds.width + shift
            self.initialPositions = newPositions //Here happens the error

        } else {

            var newPositions = self.finalPositions
            newPositions[index].origin.x = self.superview!.bounds.width * 0.5 - self.bounds.width + shift
            self.finalPositions = newPositions //Also here happens

        }
    }
}

任何人都可以向我解释该错误的性质吗?

最佳答案

使协议(protocol)成为引用类型

protocol Positions: AnyObject {

关于ios - 无法分配给属性 : 'self' is immutable swift error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52727345/

相关文章:

ios - 关于 "Declaration is only valid at file scope"

ios - 带有 Storyboard的部分 View

ios - 如何远程加载数据到Cloudkit

C# - 从静态类中获取静态属性的值

c# - 如何验证属性值?

ios - AFNetworking:设置 GET 参数 * 和 * 拦截重定向

ios - 将从图库中获取的图像设置为 UIImageView

ios - 关于自动布局

arrays - 快速搜索数组元素的最佳方式(性能)

objective-c - Objective- C - 遍历类中的所有属性?