我想要一张图片移动到底部。 如果我按下一个按钮,图片应该向下移动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);
}
}
我正在回答问题的题目:
lazy属性和computed属性都可以帮助您处理在对象初始化之后才知道属性的初始值的情况。 但有些不同。 我已经强调了与粗体的区别。
如果您只是需要在其他变量初始化之后初始化一个变量,那么您应该使用lazy
,即如果只是简单地添加一个延迟(因此所有必需的属性都在之前初始化),那么使用lazy是正确的方法。
但是如果您需要不断地根据另一个变量改变一个变量,那么您需要一个可以双向工作的计算属性:
如果更改lazy属性的值,它不会影响它所基于的分层属性。 请参阅此处
使用惰性属性的一个很好的例子是,一旦您有了firstname
& lastName
然后您将懒洋洋地实例化一个fullName
,并且您可能永远不会更改对象的名字和姓氏您的fullName只是一次。。。 或者,只有lazy
属性才能完成的事情是,在您不访问该属性之前,它永远不会被初始化,因此这将减少类的初始化负载。 正在进行一项繁重的计算。
此外,使用lazy
将向其他开发人员发出信号:“嘿,首先去阅读其他属性并了解它们是什么。。。然后来查看这个lazy属性。。。因为它的值是基于它们的。。。这可能是一个很大的计算,不应该过早地访问。。。”
至于计算属性,一个很好的例子是,如果你将温度设置为华氏温度,那么你也想要你的摄氏温度改变它的值。。。如果你设置摄氏温度,那么你也想要改变你的华氏值。
因此,计算属性会增加额外的计算量。。。如果您的计算非常简单,并且调用的频率不是太高,那么这没什么好担心的,但是如果它被调用的频率太高或者非常消耗CPU,那么考虑其他选项可能会更好。。。
您的从属属性必须是:
懒
: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'
@Martinr在这里点出了大是大非:
var corX = 0
var corY = 0
var 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
及其属性已经存在。
问题内容: 我希望图片移到底部。如果按按钮,图片应向下移动1。 我添加了图片和一个按钮: 至少我在函数“ fahren”中说过将图片向下移动1。 所以我的问题是:这些corX和corY东西会出现一些错误。没有它们,它会完美地工作,但比起一次性按钮就好。错误是:ViewController.Type没有名为corX的成员,而ViewController.Type没有名为panzer的成员。 PS:我
问题内容: 您如何初始化此: DI框架,反思,更好的设计? 动机和用例(添加) : 我的特殊用例是简化和的子类中的字段访问。因此,我将它们注入以通过派生类中的字段短期引用它们,而无需在每个子类中显式声明。 问题答案: 您可以使用工厂方法
但是我得到错误“在初始化之前使用属性”这是有道理的,因为我只声明。但是我不知道我应该如何或为了什么初始化输入,因为值是输入
问题内容: 我已经搜索了很多,但是我发现的主要是python中的递归编程示例。因此,问题来了: 我该如何实现? 问题答案: 一切在Python中都是动态的-甚至是类声明。在初始声明之后,没有什么可以阻止您修改类的内容的: 注意:如果您不太熟悉Python,则该关键字仅允许您说“这里什么都没有”-除非A类的空值与本例中的一样空,否则它并不重要!
问题内容: 我想从属性文件中的init我的ORB(通常我初始化它像这样,在运行我的例子: ) 我写了一个简单的代码: 然后尝试初始化我的球体: 但是有一些错误: 我的config.properties文件: 我做错了什么? 通常,当我初始化我的ORB时,一切都很好,所以它不是代码问题,而是文件初始化的问题。 问题答案: 您还必须添加到ORB参数。将其与您通常使用的命令行进行比较。所有参数都必须传递
我在代码中使用了合成属性。但想知道它如何以及何时初始化Android中的每个视图。 我们只提供导入和访问每个视图的ID。何时为视图对象分配内存?
我对阿帕奇骆驼很陌生。我们需要同时处理多个动态的路由生命周期。 “等待,因为仍有2个飞行和挂起的交换要完成,超时300秒。”-此消息继续 没有打印任何内容,但B不工作(没有日志,没有任何内容)
我正在用JPA创建一个Springboot项目。我可以完美地连接到空模式SQL数据库并启动服务器。但是,在SQL数据库中创建表并创建相应的表的和之后,我会得到以下错误: