2014-06-10 97 views
6

我只問自己,爲什麼我不能在斯威夫特做這樣的事情直接在我的類聲明:問題與斯威夫特宣言

let width = 200.0 
let height = 30.0 

let widthheight = width-height 

我不能創建與其他2個常數不變。如果我在一個函數/方法中使用這一切,一切工作正常。

感謝

+0

您得到的錯誤是什麼?它在這裏工作。 – Mani

+0

更好閱讀此​​https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-XID_1 –

+0

@Mani The OP意味着它**在課堂**內。 –

回答

11

當你寫let widthheight = width - height,這隱含意味着let widthheight = self.width - self.height。在Swift中,你只是被禁止使用self,直到其所有成員都被初始化 - 在這裏,包括widthheight

你有一個init方法多一點靈活性,不過,在這裏你可以這樣寫:

class Rect { 

    let width = 200.0 
    let height = 30.0 
    let widthheight: Double 
    let widthheightInverse: Double 

    init() { 
     // widthheightInverse = 1.0/widthheight // widthheight not usable yet 
     widthheight = width - height 
     widthheightInverse = 1.0/widthheight // works 
    } 

} 
-2

對於這樣的事情,你可以利用類變量。該代碼是這樣的:

class var width = 200.0 
class var height = 30.0 
class var widthheight = width - height 

但是當你嘗試一下,你會看到一個編譯器錯誤:

Class variables are not yet supported

我想他們還沒有實現該功能呢。但現在有一個解決方案。只要將你的聲明類的聲明之外,像下面:

let width = 200.0 
let height = 30.0 
let widthheight = width - height 

class YourClass { ... 
+1

我認爲你正在混合不同的概念,不解決OP的問題。 –

+0

以多種語言使用靜態(類)變量和常量是一種很好的做法。它確實解決了OP的問題,而不會覆蓋任何方法。 – Adam

+1

如果OP試圖對對象的字段/屬性進行建模:static/class字段不合適,並且都不是全局變量。 –

1

這是一個計算性能這樣的候選人:

class Foo { 
    let width = 200.0 
    let height = 30.0 
    var widthheight : Double { return width - height } 
} 

你可能會提高「的問題,但它的計算每一次';也許你的應用程序將取決於重複做一次減法 - 但不太可能。如果減法是一個問題,請將widthheight設置爲init()