Swift变量初始化

时间:2016-11-07 07:43:49

标签: ios swift variables initialization

我对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="" /> 

3 个答案:

答案 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( )?