【问题标题】:how to share a initialize function between two init functions in Swift?如何在 Swift 中的两个初始化函数之间共享一个初始化函数?
【发布时间】:2017-03-06 22:54:51
【问题描述】:

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

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

我认为编写 initWithFrame 不再那么重要,但是如果我有一个包含多个初始化方法的自定义类,我想通过使用共享初始化程序来简化呢?

在 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
}

`

【问题讨论】:

  • @vadian 有你的答案。您还可以将“共享”部分分解为初始化超级视图之前和之后所需的部分。虽然不是一行代码(或函数),但它确实简化了事情。

标签: swift initialization


【解决方案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 方法。但是,出于类型安全的原因,建议使用第一种方法。

反正规则是:

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

【讨论】:

  • 是的,我确实确定了这一点。只需在属性声明中设置属性的默认值,然后在super.init() 之后的共享方法中处理其他所有内容。谢谢。
猜你喜欢
  • 2015-10-09
  • 2021-11-15
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多