我对swift中的变量初始化有疑问。
我有两种方法来初始化变量(作为"属性"在Objective-C中的类)。
哪一个最正确?
var str = "abc,def,ghi,jkl,mno,pqr";
var x = str.split(",");
var input = document.querySelectorAll('.txtOne');
for (var i = 0; i < input.length; i++){
input[i].value = x[i];
}
或
<input class="txtOne" name="txtOne" type="text" value="" />
<br/>
<input class="txtOne" name="txtOne" type="text" value="" />
<br/>
<input class="txtOne" name="txtOne" type="text" value="" />
答案 0 :(得分:25)
实际上,您有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
}()
答案 1 :(得分: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
的更多信息答案 2 :(得分:0)
var label: UILabel!
以上陈述表示,变量标签可能为零
var label = UILabel()
但在这里它会保留一个标签值。因为内存是为该变量分配的。所以它不会是零。
请在此处查找更多详情
What's the difference between var label: UILabel! and var label = UILabel( )?