【问题标题】:Use Function in Initializer - Swift?在初始化程序中使用函数 - Swift?
【发布时间】:2016-03-25 13:00:54
【问题描述】:

假设如下:

class A {
    let x : Int
    init() {
        self.x = assign(1)
    }
    func assign(y : Int) -> Int {
        return y
    }
}

这会产生错误。

这是我的问题:有没有办法在类初始化程序中调用函数?

编辑:添加错误消息:

在初始化所有存储的属性之前在方法调用“assign”中使用“self”

【问题讨论】:

  • 您遇到的异常/错误是什么?看看你得到的实际结果会很有帮助
  • 有多种解决方案,但实际用例会有所帮助。

标签: swift initialization


【解决方案1】:

在实例初始化之前(在init 完成之前)您不能调用实例方法,但您可以使用模块级函数和使用classstatic 关键字定义的type methods

func compute(y: Int) -> Int {
  return y
}

class A {
  let x: Int

  static func assign(y: Int) -> Int {
    return y
  }

  init () {
    x = A.assign(3) + compute(4)
  }
}

【讨论】:

    【解决方案2】:

    另一个(可能有帮助)选项是让您在初始化程序范围内调用的函数:

    class A {
        let x : Int
        init() {
            func assign(y : Int) -> Int {
                return y
            }
            self.x = assign(y: 1)
        }
    }
    

    我现在正在一个项目中这样做。我有一个 large 初始化程序(它实际上是一个解析器)并使用初始化程序范围的函数来报告错误。当然,我更希望函数位于类范围内,这样我就可以在初始化程序之间重用它。但至少我可以在每个初始化器中重用它。

    【讨论】:

      【解决方案3】:

      我认为这不是最好的解决方案,但它仍然有效。

       class A {
              var variable : Int
      
              init() {
      
                  self.variable = A.assign(1)
      
              }
      
              private class func assign(y : Int) -> Int {
                  return y
              }
          }
      

      【讨论】:

      • 它有效,谢谢。出于好奇,为什么这种方法有效,而以前的方法无效?
      • 它是一个类函数,这种函数不需要初始化对象或者@Sulthan你能深入解释一下吗
      • 我有一个巨大的函数,我想从几个 init() 方法中调用它。这个巨大的函数初始化了几个类属性。我已经完成了上述操作,使这个巨大的方法成为一个“类”函数,但是我在方法中的每个属性上都得到了一个错误。当然,如果我将此代码复制并粘贴到每个 init() 方法中,它就可以工作。
      【解决方案4】:

      你可以使用类似的东西:

      class A {
          var x : Int!
          init() {
              x = assign(1)
          }
          func assign(y : Int) -> Int {
              return y
          }
      }
      

      这种方法的缺点是如果你访问x 并且它没有被初始化,你会得到一个运行时错误。查看this的答案。

      【讨论】:

      • 它可以工作,因为现在x 是可选的,因此该错误不再适用。现在你在所有存储的属性初始化之前不要使用self,因为你没有这些属性了,现在它们是可选的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多