gpt4 book ai didi

swift - 为什么我必须使用计算属性而不是存储属性来访问 convertPoint()

转载 作者:搜寻专家 更新时间:2023-10-31 23:01:29 27 4
gpt4 key购买 nike

我正在按照斯坦福大学类(class)学习 Swift 语言。第五讲有一个画笑脸的demo。

有faceCenter的声明,代码如下。

var faceCenter: CGPoint {
return convertPoint(center, fromView: superview)
}

但我的问题是为什么我可以像下面这样简单地使用 equal?

var faceCenter: CGPoint = convertPoint(center, fromView: superview)

当我这样做时,系统给出了这个错误,“Extra argument “fromView” in call”。

谁能告诉我问题所在?

最佳答案

它不起作用,因为 self 还没有初始化。在 self 可用之前必须分配每个值。

它实际上尝试使用 self 三次:

var faceCenter: CGPoint = self.convertPoint(self.center, fromView: self.superview)

不幸的是,编译器对这个错误并没有真正的帮助。


您始终可以将其设置为可选值或为其指定默认值。然后在init方法中给它正确的值。

可以在访问self 的同时创建存储属性,而无需在init 方法中分配值。这就涉及到了faceCenterBeta中的方法。它是用 lazy 声明的,以便在第一次读取时为其赋值,而不是在对象初始化时。它还使用 closure 而不是 getter 来获取值。

class Test : UIView {

var faceCenter : CGPoint = CGPointZero // give a default value, give correct value in the init method

var faceCenterAlpha: CGPoint { // getter
print("getter")
return convertPoint(center, fromView: superview)
}

lazy var faceCenterBeta: CGPoint = { [unowned self] in // closure
print("closure")
return self.convertPoint(self.center, fromView: self.superview)
}()

func faceCenterDelta() -> CGPoint { // good ol' function
print("function")
return convertPoint(center, fromView: superview)
}

init() {
super.init(frame: CGRectZero)
faceCenter = convertPoint(center, fromView: superview)
}

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

let test = Test()

// executed every time, just like a function
test.faceCenterAlpha
test.faceCenterAlpha
test.faceCenterAlpha

// only executed once
test.faceCenterBeta
test.faceCenterBeta
test.faceCenterBeta

关于swift - 为什么我必须使用计算属性而不是存储属性来访问 convertPoint(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34100412/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com