2016-11-07 141 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