在ObjC中,对于iOS,我曾经在类文件的顶部使用一堆#define
语句来设置视图布局的常量。通常,他们引用了self.frame
。我试图对Swift中的let
语句做同样的事情,并且它不允许我在任何地方使用self.frame
。我收到错误,因为无法找到frame
属性:
import UIKit
class MySubview: UIView {
/* Constants */
let frameX = (self.frame.origin.x) // error
let frameY = (self.frame.origin.y) // error
let frameW = (self.frame.size.width) // error
let frameH = (self.frame.size.height) // error
// ...
}
为什么抱怨?我是UIView
的子类,所以属性应该在那里。我该如何解决这个问题?
答案 0 :(得分:2)
你所拥有的实际上不是常数,因为框架可以改变。在允许访问let
之前,在初始化阶段设置常量属性的值(使用self
),并且不能更改。
在您的情况下,您应该使用computed properties:
class MySubview: UIView {
var frameX: CGFloat { return frame.minX }
var frameY: CGFloat { return frame.minY }
var frameW: CGFloat { return frame.width }
var frameH: CGFloat { return frame.height }
// ...
}
另外,请注意Swift中CGRect
上更方便的方法,这可能会使这些便利变量中的一些变得多余。