web-dev-qa-db-ja.com

'インスタンスメンバーを型に使用できない'エラーを与える遅延変数

私は今このエラーを数回経験し、さまざまな回避策に頼りましたが、なぜそれが起こるのか本当に興味があります。基本的なシナリオは次のとおりです。

class SomeClass {
  var coreDataStuff = CoreDataStuff!
  lazy var somethingElse = SomethingElse(coreDataStuff: coreDataStuff)
}

したがって、クラスが完全に初期化される前にselfを使用できないことは理解していますが、この場合、selfプロパティcoreDataStuffを使用して、インスタンスの準備ができるまで発生しない遅延変数を初期化します。

なぜ私がInstance member can not be used on typeエラー?

21
66o

それを試してください:

class SomeClass {
  var coreDataStuff = CoreDataStuff!
  lazy var somethingElse: SomethingElse = SomethingElse(coreDataStuff: self.coreDataStuff)
}

怠惰な変数のタイプを正確にし、渡す引数にself.を追加することが重要です。

32
AncAinu

Swiftのレイジー変数では見落とされがちな2つの要件がありますが、残念ながら、警告は不可解であり、修正方法を説明していません。

怠惰な変数の要件

  1. se self. :インスタンスメンバーを参照する場合は、self.を使用する必要があります。 (例:self.radius。)

    self.の使用を忘れると、次のエラーが発生します。

    インスタンスメンバー「myVariable」はタイプ「MyType」では使用できません

  2. タイプを指定してください:タイプを推測することはできません。明示的に記述する必要があります。 (例:: Float。)

    タイプの指定を忘れると、次のエラーが発生します。

    未解決の識別子「self」の使用

struct Circle {
  let radius: Float
  lazy var diameter: Float = self.radius * 2 // Good
//lazy var diameter        =      radius * 2 // Bad (Compile error)
}
9
Senseful