2015-03-18 49 views
1

在ObjC中,對於iOS,我曾在類文件的頂部使用一堆#define語句來設置視圖佈局的常量。通常,他們引用self.frame。我試圖在Swift中使用let語句,並且它不會讓我在任何地方使用self.frame。我得到的錯誤,因爲frame財產不能找到:在UIView的let語句中引用self.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,所以房產應該在那裏。我該如何解決?

回答

2

你有什麼事實上不是常量,因爲框架可以改變。在允許訪問self之前,初始化階段設置了不變屬性的值(使用let),並且不能更改。

在你的情況,你應該用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 } 
    // ... 
} 

此外,請注意在雨燕上CGRect更方便的方法,這可能使一些方便的變量有些多餘。

+0

這個工作除了它希望我明確定義計算機屬性的類型,所以我讓它'frameX:CGFloat'等。謝謝。 – sudo 2015-03-18 23:04:02

+0

啊,是的,對不起,當我寫回答時,我不在電腦前。我用顯式類型更新了它。 – Stuart 2015-03-18 23:29:20