如何在Swift中的两个init函数之间共享初始化函数?

时间:2017-03-06 14:42:45

标签: swift initialization

我习惯于编写共享- (void) initialize函数来处理Objective-C中的initWithFrameinitWithCoder函数。

但是,在Swift中,我似乎不允许在调用super.init()之前调用函数来执行此操作,之后也不允许这样做,因为在此之前需要初始化属性。

我认为编写initWithFrame不再那么重要了,但如果我有一个自定义类有多个init方法,我希望通过使用共享初始化程序来简化该怎么办?

在super.init()之前:

required init?(coder aDecoder: NSCoder) {        
    self.initialize()//use of self in method call initialize before super.init()
    super.init(coder: aDecoder)    
}

在super.init()之后:

required init?(coder aDecoder: NSCoder) {        
    super.init(coder: aDecoder)
    self.initialize()//property not initialized at super.init call
}

`

1 个答案:

答案 0 :(得分:1)

这取决于要初始化的存储属性。

例如,您可以为属性

指定默认值
class Foo {

   var name = ""
   var age = 0

   let formatter : DateFormatter = {
       let df = DateFormatter()
       df.dateFormat = "yyyy/MM/dd"
       return df
   }()
}

或使用隐式展开选项

class Foo {

   var name = String!
   var age = Int!

   var formatter : DateFormatter! 

}

在这两种情况下,所有属性都已初始化,您可以先调用super然后再调用initialize方法。但是出于类型安全的原因,建议采用第一种方式。

无论如何,规则是:

  • 所有非可选属性必须在之前初始化,而self只能在调用超级
  • 之后使用