在初始化程序中访问实例属性会给出"在初始化之前使用的变量"在某些情况下

时间:2016-03-31 18:23:06

标签: swift

任何人都可以向我解释为什么这段代码会编译:

class MyClass {
  let a: Bool
  let b: Bool

  init(aa: Bool, bb: Bool) {
    self.a = aa
    if self.a {/*Do Stuff*/}
    self.b = bb
  }
}

但是这段代码会抛出编译错误

  

Constant' self.c'在初始化之前使用

在第if self.a && self.b {/*Do Stuff*/}行:

class MyClass {
  let a: Bool
  let b: Bool
  let c: Bool

  init(aa: Bool, bb: Bool, cc: Bool) {
    self.a = aa
    self.b = bb
    if self.a && self.b {/*Do Stuff*/}
    self.c = cc
  }
}

我对Swift的两阶段初始化(https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-ID203)有一些基本的了解,我很确定这是错误的原因,但根据我的理解,不应该这样做。两个代码片段都抛出相同的编译器错误?

1 个答案:

答案 0 :(得分:0)

是的,它与两阶段初始化有关。第二个示例中的问题是&&

与此相关的安全检查(以及您的链接):

“初始化程序无法调用任何实例方法,读取任何实例属性的值,或者在初始化的第一阶段完成之后将self作为值引用。”

修改您的第一个示例并添加&&操作者:

class MyClass {
      let a: Bool
      let b: Bool

      init(aa: Bool, bb: Bool) {
            self.a = aa
            if self.a && self.b {/*Do Stuff*/}
            self.b = bb
      }
}
//Playground execution failed: MyPlayground.playground:4:26: error: constant 'self.b' used before being initialized
            if self.a && self.b {/*Do Stuff*/}

修改您的第二个示例并删除&&操作者:

class MyClass {
      let a: Bool
      let b: Bool
      let c: Bool

      init(aa: Bool, bb: Bool, cc: Bool) {
            self.a = aa
            self.b = bb
            if self.a  {/*Do Stuff*/}
            self.c = cc
      }
}

//it runs fine

当然在使用&&&操作员完成初始化的第一阶段以及安全检查。但是,如果您尝试在初始化所有属性之前执行操作,则安全检查将失败。您还将受限于if self.a {/*Do Stuff*/}关闭中您可以执行的操作。