Properties 多个实例中的Swift唯一属性

Properties 多个实例中的Swift唯一属性,properties,swift,instance,Properties,Swift,Instance,我知道理论上可以创建同一类的多个实例,每个实例的属性值不同 问题是,我不能让它发生 每次我创建一个新实例时,它都会获取其他实例的属性值,当我为一个实例更改一个值时,它也会更改其他实例的属性值 所以我猜我做错了什么(很明显),比如访问类属性值而不是实例属性值。。。这是密码 class CustomUIImageView: UIImageView { var someParameter: Bool = false // This is the property I want to be di

我知道理论上可以创建同一类的多个实例,每个实例的属性值不同

问题是,我不能让它发生

每次我创建一个新实例时,它都会获取其他实例的属性值,当我为一个实例更改一个值时,它也会更改其他实例的属性值

所以我猜我做错了什么(很明显),比如访问类属性值而不是实例属性值。。。这是密码

class CustomUIImageView: UIImageView {
    var someParameter: Bool = false // This is the property I want to be different in each version of the instance. 
}


class ClassSiege: UIViewController, UIGestureRecognizerDelegate {    

    var myView: CustomUIImageView! //the instance declaration. 

    // I use this gesture recognizer to find out the value of the instance I'm tapping on.
    func handleTap (sender: UITapGestureRecognizer) {
        print("value of someParameter \(self.myView.someParameter)")
    }

    func handlePan(recognizer: UIPanGestureRecognizer) {
        let iv: UIView! = recognizer.view
        let translation = recognizer.translationInView(self.view)
        iv.center.x += translation.x
        iv.center.y += translation.y
        recognizer.setTranslation(CGPointZero, inView: self.view)

        var centerBoardX = BlackBoard.center.x // 'Blackboard' is a fixed image on the screen. 
        var centerBoardY = BlackBoard.center.y
        var centerRondX = iv.center.x
        var centerRondY = iv.center.y

        if centerRondY - centerBoardY < 100 { 
            self.myView.someParameter = true // If the distance between myView and the blackboard is under 100 I want the instance's property to become true. 
        } else {
            self.myView.someParameter = false // On the other hand, if the distance is greater than 100, I want it to be false. 
        }
    }

    // When the user pushes a button, it triggers this method that creates a new instance of myView and add it to the screen. 
   @IBAction func showContent(sender: AnyObject) {
       // some code...
       // Here I'm creating the instance of the view and I give it the gesture recognizer parameters. I don't think that relevant to the issue, so I'm not adding the code.
    }
}
class CustomUIImageView:UIImageView{
var someParameter:Bool=false//这是我希望在实例的每个版本中都有所不同的属性。
}
类:UIViewController,UIGestureRecognitizerDelegate{
var myView:CustomUIImageView!//实例声明。
//我使用这个手势识别器来找出我正在点击的实例的值。
func handleTap(发送方:UITapGestureRecognitizer){
打印(“someParameter\(self.myView.someParameter)的值”)
}
func handlePan(识别器:UIPangestureRecognitor){
let iv:UIView!=识别器.view
let translation=recognizer.translationView(self.view)
iv.center.x+=translation.x
iv.center.y+=translation.y
识别器.setTranslation(CGPointZero,inView:self.view)
var centerBoardX=BlackBoard.center.x/“BlackBoard”是屏幕上的固定图像。
var centerBoardY=黑板.center.y
var centerRondX=iv.center.x
var centerRondY=iv.center.y
如果centerRondY-centerBoardY<100{
self.myView.someParameter=true//如果myView和黑板之间的距离小于100,我希望实例的属性变为true。
}否则{
self.myView.someParameter=false//另一方面,如果距离大于100,我希望它为false。
}
}
//当用户按下按钮时,它会触发此方法,该方法创建myView的新实例并将其添加到屏幕中。
@iAction func showContent(发件人:AnyObject){
//一些代码。。。
//在这里,我创建了视图的实例,并给出了手势识别器参数。我认为这与问题无关,所以我不添加代码。
}
}

很明显,这不是一个好办法,但是有什么问题,怎么解决呢

我的回答是基于你的亲戚

如果要实现的是使用您提供的值初始化属性,只需向初始值设定项添加一个新参数。例如,如果您使用传递了
CGRect
的初始值设定项,则可以实现如下初始值设定项:

class CustomUIImageView : UIImageView {
    let someParameter : Bool

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

     init(frame: CGRect, someParameter: Bool) {
        self.someParameter = someParameter
        super.init(frame: frame)
    }
}

我希望这就是您所寻找的,否则请告诉我。

我已经找到了解决方案,如果您一直面临同样的问题,下面是如何处理的方法。 秘密在于向下转换recognizer.view以获取子类CustomUIImageView的参数

以下是方法:

func handleTap (sender: UITapGestureRecognizer) {

println("value of someParameter \(self.myView.someParameter)") //I use this gesture recognizer to find out the value of the instance I'm tapping on. 

}

func handlePan(recognizer:UIPanGestureRecognizer) {
let iv : UIView! = recognizer.view
let translation = recognizer.translationInView(self.view)
iv.center.x += translation.x
iv.center.y += translation.y
recognizer.setTranslation(CGPointZero, inView: self.view)

var centerBoardX = BlackBoard.center.x //blackboard is a fixed image on the screen. 
var centerBoardY = BlackBoard.center.y
var centerRondX = iv.center.x
var centerRondY = iv.center.y

var myParameter = recognizer.view as CustomUIImageView //<- this is the key point. Downcasting let you access the custom subclass parameters of the object that is currently moved

if centerRondY - centerBoardY < 100 { 

  myParameter.someParameter = true //so now I'm really changing the parameter's value inside the object rather than changing a global var like I did before. 



} else {
    myParameter.someParameter = false 

    }

}

//when user pushes a button, it triggers this func that creates a new instance of myView and add it to the screen. 
@IBAction func showContent(sender: AnyObject) {

some code...
 //here I'm creating the instance of the view and I give it the gesture recognizer parameters. I don't think that relevant to the issue, so I'm not adding the code. 

 }
func handleTap(发送方:UITapGestureRecognizer){
println(“someParameter的值\(self.myView.someParameter)”//我使用这个手势识别器来找出我正在点击的实例的值。
}
func handlePan(识别器:UIPangestureRecognitor){
let iv:UIView!=识别器.view
let translation=recognizer.translationView(self.view)
iv.center.x+=translation.x
iv.center.y+=translation.y
识别器.setTranslation(CGPointZero,inView:self.view)
var centerBoardX=BlackBoard.center.x//BlackBoard是屏幕上的固定图像。
var centerBoardY=黑板.center.y
var centerRondX=iv.center.x
var centerRondY=iv.center.y

var myParameter=recognizer.view as CustomUIImageView//这并不是因为我不想在创建实例时用一个值初始化它,而是在创建实例之后,当用户在屏幕上移动视图时。此外,在这里使用您的代码只是让我回到我前面问题的初始问题,我无法创建框架,因为init没有被重写。但如果我这样做,编译器会抱怨,因为someParameter没有从超类继承。lol!你的意思是你只想做一些类似于
myImage.someParameter=true
?是的,但是这样做(如上所述)它会更改所有实例的值。要么是这样,要么我无法使用
println(myView.someParameter)
println从实例中正确检索值(self.myView.someParameter
。在所有实例中更改属性的唯一方法是声明为类属性:
class var myProp:Int
。如果声明为
var myProp:Int
,则每个实例都有自己的副本。但是,如果您有多个相同类型的变量,并且通过更改实例属性在一个实例中,所有其他的都有相同的更改,这意味着所有这些变量都指向类的同一个实例是的,我认为这一定是这样的。但这让我回到了一个旧问题,这个问题没有解决…如何确保我的变量的值只在我移动的实例上更改我的视图?使用上面的func handlePan,我成功地获得了正在移动的视图的精确坐标,也许我应该将参数传递给它,并将uiview子类化,而不是UIImageView。你认为呢?