Swift中的阶段1和阶段2初始化

时间:2015-03-24 10:41:45

标签: swift initialization

这是Apple Swift文档的副本:

  

只要超类的所有属性都具有初始值,   其内存被认为已完全初始化,第1阶段已完成。

     

超类的指定初始化程序现在有机会   进一步自定义实例(尽管它没有)。

     

超类的指定初始化程序完成后,   子类的指定初始值设定项可以执行其他自定义   (虽然它再次没有)。

所以基本上第1阶段确保所有属性都有一个值并将值赋给它们。在阶段2中,这些属性进一步定制。而这种进一步的定制确实让我感到沮丧,因为我无法想到使用进一步定制的单个例子。您能给我一个简单的初始化行为示例,或者提供第1阶段和第2阶段的其他说明吗?感谢

5 个答案:

答案 0 :(得分:10)

给定2个类Foo和Bar,其中Bar是Foo的子类:

class Foo {
    var a: Int?
    var b: Int?

    init() {
        a = 1
    }
}

class Bar: Foo {
    var c: Int?

    override init() {
        super.init() // Phase 1

        // Phase 2: Additional customizations
        b = 2
        c = 3
    }
}

当你致电Bar()时,它会调用super.init(),第一行是初始化超类,即Foo。因此,一旦完全初始化Foo的属性,就可以在Foo的初始化程序中设置它们。这由Foo初始化程序中的a = 1表示。

一旦完成,第2阶段开始,继续在super.init()行之后初始化Bar。您可以在bar或其超类的实例上“执行其他自定义”。这由b = 2c = 3表示。

let x = Bar()
x.a // 1
x.b // 2
x.c // 3

答案 1 :(得分:1)

您希望UIView始终为红色的示例。 self.frame在第1阶段设置(通过调用[super initWithFrame:frame],您在self.backgroundColor的实施中更改initWithFrame:,即第2阶段。

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame]; <- Phase 1

    if (self) {
        //Phase 2
        self.backgroundColor = [UIColor redColor];
    }

    return self;
}

对于Objective-C代码感到抱歉,但在Siwft中它应该是相同的,只是语法不同。

答案 2 :(得分:1)

这样想。第1阶段非常有限。 全部确实设置了所有必需的属性值。在完成之前,您无法执行任何其他操作。

在第1阶段,您无法引用自我,也无法调用其他方法。这是非常有限的。

第1阶段完成后,您可以自由地调用其他方法并引用自己。

您认为在init方法中发生的代码大部分都发生在第2阶段。

如果您有一个管理网络连接的对象,则需要在阶段2中设置该网络连接,例如。

答案 3 :(得分:1)

我在Swift Innitialization中了解第一阶段和第二阶段的例子。

class A {
  var a: Int
  var b: Int
  init() {
     // This is phare 1
     a = 1
     b = 2
  }
}

 class B: A {
   var c: Character
   var d: Double
   var e: String
   overide init() {
      // This is phare 1
      c = ""
      d = 0.0
      e = ""
      This is Phase 2
      d = 10
      e = "abc"
  }
 }

答案 4 :(得分:1)

阶段1:从子类到超类,分配内存和init属性
阶段2:从超类继续到子类,自定义