为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕少森 2019-06-01 14:39:51
如何初始化相互依赖的属性我想要一张照片移到底部。如果我按下按钮,图片应该向下移动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);     }}
查看完整描述

3 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

var corX = 0var corY = 0var panzer = UIImageView(frame: CGRectMake(corX, corY, 30, 40))

问题是SWIFT默认初始化器不能引用另一个属性的值,因为在初始化时,该属性还不存在(因为实例本身还不存在)。基本上,在panzer的默认初始化程序。self.corXself.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它的性质是存在的。


查看完整回答
反对 回复 2019-06-01
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

您的受抚养财产需要:

  1. lazy

  2. 明示

    : Type

  3. 使用

    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'


查看完整回答
反对 回复 2019-06-01
  • 3 回答
  • 0 关注
  • 471 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信