Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法分配给属性:';自我';是不变的快速错误_Ios_Swift_Properties_Self - Fatal编程技术网

Ios 无法分配给属性:';自我';是不变的快速错误

Ios 无法分配给属性:';自我';是不变的快速错误,ios,swift,properties,self,Ios,Swift,Properties,Self,在我的应用程序中,我创建了一个名为“Positions”的协议,并扩展UIView类以符合该协议,以便向UIView类添加一些属性。我使用了下面的代码 import Foundation import UIKit protocol Positions { var initialPositions: [CGRect] {get set} var finalPositions: [CGRect] {get set} var positionsAreDefined: Bool

在我的应用程序中,我创建了一个名为“Positions”的协议,并扩展UIView类以符合该协议,以便向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类,该方法可以更改“由我添加”属性,但编译器在我尝试修改属性值的行中给了我这个错误:

无法分配给属性:“self”是不可变的

方法如下:

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 Positions: AnyObject {

非类绑定协议具有值语义,因此必须使用
mutating
修饰符声明任何变异函数,就像它们在结构定义中一样。如果要使用
objc\u getAssociatedObject
和其他Objective C运行时特性,则需要将其设置为类绑定协议。否则它会起作用,但你会注意到奇怪的行为。结构被装箱到一个
\uuu SwiftValue
,ObjC运行时可以使用它,但它们的对象标识不稳定。对象标识是ObjC运行时在其关联对象表中用作键的对象标识。@Carcigenicate我编辑了我的post@Alexander你建议我在“horizontallyInContainer”方法声明之前加上关键字“mutating”吗?@Alexander你能解释一下我如何将其作为类绑定协议吗?好的,谢谢,它是有效的……你能解释一下它的作用吗?也许能告诉我一些我能读到的东西,只是为了避免再次犯同样的错误?:)在中对其进行了讨论,但是在最新版本中,建议使用符合
AnyObject
的对象,而不是抽象