我有一个关于变量初始化在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我担心第二个是这样做的一种错误的方式。谢谢,现在我看到:) –