猿问

如何初始化相互依赖的属性

如何初始化相互依赖的属性

我想要一张照片移到底部。如果我按下按钮,图片应该向下移动1。

我添加了图片和按钮:

var corX = 0var corY = 0var runter: UIButton = UIButton.buttonWithType(UIButtonType.System) as UIButtonvar
 image = UIImage(named: "panzerBlau.jpg");var panzer = UIImageView(frame: CGRectMake(corX, corY, 30, 40));
   //override func viewDidLoad() {
    super.viewDidLoad()

    panzer.image = image;    //    self.view.addSubview(panzer);    //
    runter.frame = CGRectMake(100, 30, 10 , 10)
    runter.backgroundColor = UIColor.redColor()
    view.addSubview(runter)
    runter.addTarget(self, action: "fahren", forControlEvents:UIControlEvents.TouchUpInside)}

至少我在函数“fahren”中说把图片向下移动1。

func fahren(){
    corY += 1
    panzer.frame = CGRectMake(corX, corY, 30, 40) //    self.view.addSubview(panzer);}

所以我的问题是:这些corx和cory的东西有几个错误。没有它们,它工作的完美,但它比一个单一用途按钮。错误是:ViewController.Type没有一个名为corX的成员,而ViewController.Type没有一个成员名为panzer,在这里我得到了我所做的/显示在哪些行中的错误。

PS:我使用Xcode Beta 5

下面是没有其他任何内容的完整代码:

import UIKitclass ViewController: UIViewController {

    var corX = 0
    var corY = 0
    var runter: UIButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
    var image = UIImage(named: "panzerBlau.jpg");
    var panzer = UIImageView(frame: CGRectMake(corX, corY, 30, 40));

    override func viewDidLoad() {
        super.viewDidLoad()
            panzer.image = image;
            self.view.addSubview(panzer);

        runter.frame = CGRectMake(100, 30, 10 , 10)
        runter.backgroundColor = UIColor.redColor()
        view.addSubview(runter)
        runter.addTarget(self, action: "fahren", forControlEvents:UIControlEvents.TouchUpInside)
    }

    func fahren(){
        corY += 100
        panzer.frame = CGRectMake(corX, corY, 30, 40)
        self.view.addSubview(panzer);
    }}


慕少森
浏览 516回答 3
3回答

慕丝7291255

var corX = 0var corY = 0var panzer = UIImageView(frame: CGRectMake(corX, corY, 30, 40))问题是SWIFT默认初始化器不能引用另一个属性的值,因为在初始化时,该属性还不存在(因为实例本身还不存在)。基本上,在panzer的默认初始化程序。self.corX和self.corY-但没有self因为self正是我们正在创造的东西。解决方法之一是使初始化程序懒惰:class ViewController: UIViewController {     var corX : CGFloat = 0     var corY : CGFloat = 0     lazy var panzer : UIImageView = UIImageView(frame: CGRectMake(self.corX, self.corY, 30, 40))     // ...}这是合法的,因为panzer直到稍后第一次被实际代码引用时才被初始化。到那时,self它的性质是存在的。

幕布斯6054654

您的受抚养财产需要:lazy明示: Type使用self.访问其他属性例子:let original = "foo"// Good:lazy var depend: String = self.original// Error:     var noLazy: String = self.original // Error: Value of type '(NSObject) -> () -> URLData' has no member 'original'lazy var noType         = self.original // Error: Value of type '(NSObject) -> () -> URLData' has no member 'original'lazy var noSelf: String = original      // Error: Instance member 'original' cannot be used on type 'YourClass'
随时随地看视频慕课网APP
我要回答