2016-11-07 91 views
4

我有一個關於變量初始化在swift中的問題。迅速變量初始化

我有兩種方法來初始化一個變量(作爲Objective-C中類的「屬性」)。

他們哪一個最正確?

class Class { 

    var label: UILabel! 

    init() { ... label = UILabel() ... } 

} 

class Class { 

    var label = UILabel() 

    init() { … } 

} 
+0

這不是正確的問題。這是一個需求和代碼樣式的問題。如果計算'label'的值,您將使用第一個變體。如果這個值就像一個常量,你會傾向於第二個變體(可能使用'let'而不是'var')。但例外證明了這一規則。 ;) – clemens

+0

@macmoonshine我擔心第二個是這樣做的一種錯誤的方式。謝謝,現在我看到:) –

回答

15

其實你有5種方法來初始化屬性。

有沒有正確的方法,方式取決於需求。
基本上聲明像UILabel這樣的對象總是 - 如果可能的話 - 如常數(let)。

的5種方法是:

  • 初始化在聲明行

    let label = UILabel(frame:... 
    
  • 初始化在init方法,你不必申報財產隱式展開可選。

    let label: UILabel 
    init() { ... label = UILabel(frame:...) ... } 
    

前兩個方法實際上是相同的。

  • 初始化像viewDidLoad的方法,在這種情況下,你必須也爲var

    var label: UILabel! 
    
    on viewDidLoad() 
    ... 
    label = UILabel(frame:...) 
    } 
    
  • 初始化使用閉包分配一個默認的(對財產申報爲(隱含解開)可選的,計算)值。當類被初始化時,閉包被調用一次,並且不可能在閉包中使用該類的其他屬性。

    let label: UILabel = { 
        let lbl = UILabel(frame:...) 
        lbl.text = "Foo" 
        return lbl 
    }() 
    
  • 使用閉包的惰性初始化。當屬性第一次被訪問時,閉包被調用(一次),並且您可以使用該類的其他屬性。
    屬性必須聲明爲var

    let labelText = "Bar" 
    
    lazy var label: UILabel = { 
        let lbl = UILabel(frame:...) 
        lbl.text = "Foo" + self.labelText 
        return lbl 
    }() 
    
+0

'let label:UILabel(frame:...'< - 不應該是'='而不是':' – user28434

+0

Right,thank you @ user28434 – vadian

+0

謝謝你這個偉大回答!)@vadian –

0

這兩種方法都是正確的,但有時你應該init()方法使用初始化。例如,這裏的barButton的target將不會被設置,導致self還不存在。

class Foo { 
    var barButton = UIBarButtonItem(title: "add", style: .Plain, target: self, action: #selector(self.someMethod)) 

    init(){ 
     //init here 
    } 
} 

這種情況的正確方法是:

class Foo { 
    var barButton : UIBarButton? 

    init(){ 
     barButton = UIBarButtonItem(title: "add", style: .Plain, target: self, action: #selector(self.someMethod)) 
    } 
} 

綜上所述,兩種方式都是正確的,但是你要考慮何時使用每一個。 關於它的更多信息Apple documentation