Swift中的初始化器构造

时间:2014-12-28 21:34:43

标签: ios swift

学习Swift我经常看到以下构造来制作初始化器:

class customClass: NSObject {

    let what: String
    let location: GeoLocation


    init(what: String, location: GeoLocation){

        self.what = what
        self.location = location
    }

这让我感到困惑,究竟是什么意思?我仍然不明白这个的全部意义,如果我已经宣布属性为什么我应该做一个初始化和那个构造? (重复变量名称和类型,然后 - self.var = var)

此外,它非常适合像UIViewController这样的类,不能创建初始化器:

class ViewController: UIViewController {

  @IBOutlet var mapView : MKMapView!

 private  var treasures: Array<Treasure> = []
 private   var foundLocations: [GeoLocation] = []
 private var polyline: MKPolyline!

//That class work fine without convenience or designated initializer

所以我的问题是,在swift中构造指定初始化器的确切含义,以及初始化器本身,以及我想知道的是必要的吗?我能够在头部声明变量(就像我在类ViewController:UIViewController中所做的那样)?

任何帮助,解释将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:1)

拥有初始化程序的目的是确保在使用之前正确设置类的对象。

在第一个示例中,您声明了两个不可变属性,而没有给它们赋值。调用初始化程序时,会为两个iVar指定属性,并正确初始化该类以供使用。

在第二个示例中,您正在创建可变属性(因为您声明它们是var)并且您也给它们默认值,因此即使没有初始化器,也会设置所有属性,除非在这种情况下,因为属性是可变的,您可以在以后更改它们以包含更多有用的信息。

此外,对于初始化者,Swift比Objective-C更严格。如果未在初始化程序中正确设置对象,则无法编译代码。此外,在设置所有本地属性之前,您的代码不能离开初始化程序的范围。这就是为什么在初始化子类时,在设置所有子类属性之前不要调用超类初始化器,这与在设置本地属性之前调用超类初始化器的Objective-C不同。

所有这些都来自Swift对安全性和弹性的关注。

答案 1 :(得分:-1)

您可以使用结构代替类。如果你不想做初始化。