2015-05-20 159 views
3

我試圖創建一個依賴於另一個以下列方式恆定不變斯威夫特:依賴於其他不變

class Thingy { 
let paddingConstant = 13.0 
let paddingDict = ["padding": paddingConstant] 
} 

底線給我一個錯誤"Thingy.Type does not have a member named 'paddingConstant'"

是否有可能宣佈一個依賴於另一個恆定?

+0

是的,這是可能的。你需要讓paddingDict只讀屬性計算的 –

+1

【如何初始化互相依賴的屬性]可能的複製(http://stackoverflow.com/questions/25854300/how-to-initialize-properties-that-depend-on -彼此)。然而 –

回答

1

作爲另一種解決方案,您可以使用外部結構定義(您可能需要等常量)常量:

struct Constants { 
    static let paddingConstant = 13.0 
} 

,然後在Thingy類使用它:

class Thingy { 
    let paddingDict = ["padding": Constants.paddingConstant] 
} 
0

是的,這是可能的。你需要讓paddingDict只讀屬性計算

class Thingy { 

    let paddingConstant = 13.0 

    var paddingDict : [String : Double] { 

     get {return ["padding": paddingConstant] } 
    } 
} 
+3

這將創建在每次使用paddingDict – giorashc

+0

沒有它不會產生對每次使用的字典詞典,但會計算每使用,因爲你的paddingDice使用其他屬性來計算它的價值應該是一個計算財產的價值。您可以瞭解更多有關計算性能在這裏https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254 –

+1

@zellb你能說明明確指出的地方嗎?如果每次都計算屬性,那麼計算的一個步驟就是創建一個字典。 –

5

您可以移動paddingDict到init:

class Thingy { 
    let paddingConstant = 13.0 
    let paddingDict : [String: Double] 
    init() { 
     paddingDict = ["padding": paddingConstant] 
    } 
} 
+0

您不能在viewDidLoad –

+0

中爲常量賦值。除了'viewDidLoad'部分,這是正確的。 –

+0

好的,謝謝,夥計們。我會刪除那部分! (我顯然是在考慮變量)。 – Tim

6

另一種解決方案是聲明這個變量lazy。其優點是,與計算屬性不同,它不會在您每次獲取其值時執行計算;但缺點是,它不能是一個常量,不幸的是:

class Thingy { 
    let paddingConstant = 13.0 
    lazy var paddingDict : [String:Double] = 
     ["padding": self.paddingConstant] 
} 

我認爲這限制在斯威夫特語言的錯誤。

2

你可以如果b定義爲static,則使用另一個constant property b的值填充instance constant property a(在定義時間)。

class Thingy { 
    static let paddingConstant = 13.0 
    let paddingDict = ["padding": paddingConstant] 
} 

這是直接回答你得到了錯誤信息:

Thingy.Type沒有一個名爲 'paddingConstant'

逸岸成員通過使paddingConstant一成不變的,它成爲Type propertyThingy.Type的一部分。

希望這會有所幫助。