我习惯于编写共享- (void) initialize
函数来处理Objective-C中的initWithFrame
和initWithCoder
函数。
但是,在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
}
`
答案 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
只能在调用超级