在UIView中的let语句中引用self.frame

时间:2015-03-18 21:20:09

标签: cocoa swift

在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的子类,所以属性应该在那里。我该如何解决这个问题?

1 个答案:

答案 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上更方便的方法,这可能会使这些便利变量中的一些变得多余。