当前位置: 首页 > 面试题库 >

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

戚鸿福
2023-03-14
问题内容

我希望图片移到底部。如果按按钮,图片应向下移动1。

我添加了图片和一个按钮:

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)
}

至少我在函数“ 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 Beta5

这是没有其他内容的完整代码:

import UIKit

class 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);
    }
}

问题答案:

@MartinR在这里指出了主要问题:

var corX = 0
var corY = 0
var 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它的属性已经存在。



 类似资料:
  • 问题内容: 您如何初始化此: DI框架,反思,更好的设计? 动机和用例(添加) : 我的特殊用例是简化和的子类中的字段访问。因此,我将它们注入以通过派生类中的字段短期引用它们,而无需在每个子类中显式声明。 问题答案: 您可以使用工厂方法

  • 但是我得到错误“在初始化之前使用属性”这是有道理的,因为我只声明。但是我不知道我应该如何或为了什么初始化输入,因为值是输入

  • 问题内容: 我已经搜索了很多,但是我发现的主要是python中的递归编程示例。因此,问题来了: 我该如何实现? 问题答案: 一切在Python中都是动态的-甚至是类声明。在初始声明之后,没有什么可以阻止您修改类的内容的: 注意:如果您不太熟悉Python,则该关键字仅允许您说“这里什么都没有”-除非A类的空值与本例中的一样空,否则它并不重要!

  • 问题内容: 我想从属性文件中的init我的ORB(通常我初始化它像这样,在运行我的例子: ) 我写了一个简单的代码: 然后尝试初始化我的球体: 但是有一些错误: 我的config.properties文件: 我做错了什么? 通常,当我初始化我的ORB时,一切都很好,所以它不是代码问题,而是文件初始化的问题。 问题答案: 您还必须添加到ORB参数。将其与您通常使用的命令行进行比较。所有参数都必须传递

  • 我在代码中使用了合成属性。但想知道它如何以及何时初始化Android中的每个视图。 我们只提供导入和访问每个视图的ID。何时为视图对象分配内存?

  • 我对阿帕奇骆驼很陌生。我们需要同时处理多个动态的路由生命周期。 “等待,因为仍有2个飞行和挂起的交换要完成,超时300秒。”-此消息继续 没有打印任何内容,但B不工作(没有日志,没有任何内容)