我有一個關於變量初始化在swift中的問題。迅速變量初始化
我有兩種方法來初始化一個變量(作爲Objective-C中類的「屬性」)。
他們哪一個最正確?
class Class {
var label: UILabel!
init() { ... label = UILabel() ... }
}
或
class Class {
var label = UILabel()
init() { … }
}
我有一個關於變量初始化在swift中的問題。迅速變量初始化
我有兩種方法來初始化一個變量(作爲Objective-C中類的「屬性」)。
他們哪一個最正確?
class Class {
var label: UILabel!
init() { ... label = UILabel() ... }
}
或
class Class {
var label = UILabel()
init() { … }
}
其實你有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
}()
這兩種方法都是正確的,但有時你應該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
var label: UILabel!
以上陳述的手段,變量標籤可以是零
var label = UILabel()
但這裏將舉行一個標籤值。因爲內存是爲該變量分配的。所以它不會是零。
請找到更多的細節在這裏
What's the difference between var label: UILabel! and var label = UILabel()?
這不是正確的問題。這是一個需求和代碼樣式的問題。如果計算'label'的值,您將使用第一個變體。如果這個值就像一個常量,你會傾向於第二個變體(可能使用'let'而不是'var')。但例外證明了這一規則。 ;) – clemens
@macmoonshine我擔心第二個是這樣做的一種錯誤的方式。謝謝,現在我看到:) –