2015-07-11 80 views
1

爲什麼我不能在類級別執行具有變量或常量的操作?這是不允許的或者是否有我需要用來訪問它們的關鍵字?這是不好的做法嗎?如何訪問類常量和變量

控制器:

class ViewController: UIViewController { 
    let one = 1 
    let two = 2 
    var sum = one + two 
} 

錯誤:

ViewController.Type does not have a member named 'one'

+0

放sum = one + two,in viewDidLoad或者類似的 – DogCoffee

+1

你可以在類級聲明變量,併爲它們分配初始值,但是你不能在函數之外擁有任意代碼 – Paulw11

+0

@ Paulw11存儲數據的首選方法是什麼一個函數,以便它可用於類中的每個方法? –

回答

3

類的變量和常量必須static,例如static let one = 1

這裏只需要兩個let常量爲static,以便它們可用於初始化類和實例變量。以下適用於我:

class MyClass { 
    static let one = 1 
    static let two = 2 
    static var sum = one + two 
    var instanceProduct = one * two 
} 

MyClass.one 
MyClass.sum 
MyClass().instanceProduct 

請注意,在上面的例子中,你可以做MyClass.sum = 5。如果你的意思是保持不變,只需將它改爲static let sum = one + two即可。

要求是您在任何函數和閉包之外使用的常量被聲明爲static let。這意味着他們對於整個班級都是真正的不變的。如果您需要特定實例的常量,你不能使用它們的功能或者關閉外(如你已經注意到) - 作爲一種解決方法可變sum我建議一個lazy變量由封閉初始化:

class MyClass { 
    let one: Int // value given in `init` 
    let two = 2 
    lazy var sum: Int = { self.one + self.two }() 

    init(one: Int = 1) { 
     self.one = one 
    } 
} 
MyClass().sum // 3 
MyClass(one: 2).sum // 4 
0

簡單的解決

override func viewDidLoad() { 
     super.viewDidLoad() 
     var result = one + two 
    } 
+0

不會在課堂上發生,所以不會回答問題。 – Arkku

+0

@DogCoffee將'結果'訪問類的方法嗎?我可以在'func xyz()'中調用'result'嗎? –

+0

如果您對2個變量執行計算,我會使用返回結果的方法,無論是類還是實例方法。 – DogCoffee