2016-06-30 7 views
13

私は本当に困惑するものがあります。具体的には次のコードはコンパイラエラー "未解決の識別子自己"をトリガします。なぜこれが起こっているのかわかりません。クラスがすでにインスタンス化されています。何か不足していますか?自己を使用して素早く怠惰なインスタンス化

事前に感謝します。ここ

が何らかの理由でコード

class FirstClass { 
    unowned var second: SecondClass 

    init(second:SecondClass) { 
     self.second = second 
     print("First reporting for duty") 
    } 

    func aMethod() { 
     print("First's method reporting for duty") 
    } 
} 


class SecondClass { 

    lazy var first = FirstClass(second: self) 

    func aMethod() { 
     first.aMethod() 
    } 
} 
+0

あなたは何をしたいですか? 'SecondClass'の' FirstClass'から 'aMethod'を呼び出しますか? – Dershowitz123

+0

いいえ、ちょっとだけインスタンス化して、メソッドを無視してください。 –

答えて

18

あるその 初期値はselfを参照する場合、遅延性は、明示的な型注釈を必要とします。これはswift-evolution mailing listに記載されていますが、私はなぜの が必要なのか説明できません。

lazy var first: FirstClass = FirstClass(second: self) 
//   ^^^^^^^^^^^^ 

期待どおりのコードがコンパイルされ、実行されると

yの初期値はselfに依存しないと を必要としません

func foo(x: Int) -> Int { return x + 1 } 

struct MyClass { 
    let x = 1 

    lazy var y = foo(0)   // No compiler error 
    lazy var z1 = foo(self.x)  // error: use of unresolved identifier 'self' 
    lazy var z2: Int = foo(self.x) // No compiler error 
} 

:ここ

は、サブクラス化とは無関係である、つまり問題は、struct秒でも を発生することを実証している別の例でありますタイプ注釈。 z1/z2の初期値は、self, に依存し、明示的な型の注釈でのみコンパイルされます。

更新:スイフト4/Xcodeでこのhas been fixed 9ベータ3、 遅延特性イニシャライザは現在明示selfずにインスタンスメンバーを参照すると、明示的な型注釈なしにすることができます。 (アップデートのために@hamishに感謝します)

+0

W.r.t. "何らかの理由": 'self'は' SecondClass'型でも、 'SecondClass'のサブクラス型でも構いません。つまり、 'self'の何らかのメソッドの戻り値の型は、' self'がクラス階層にあるかどうかによって、実行時に異なることがあります。このようなクラスメソッドの戻り値を 'first'を遅延的にインスタンス化する場合、コンパイル時に' first'の型を知ることができませんでした(サブクラスの戻り型がオーバーライドされているため)。 「第1の」の型注釈。今、これは、初期化子への引数として 'self'を使うときは問題ではありませんが、おそらく上記の場合が一般化します。 – dfri

+0

(ここでは、_メソッドによっていくつかのメソッド 'self'が実行時に異なる場合があります)_私は、サブクラスが同じメソッドパラメータを持ち、戻り値の型が異なる新しいsame-nameメソッドを導入する場合を参照します。ケース 'self'はサブクラスオブジェクトであり、レイジー変数が明示的に注釈を付けられていない場合、コンパイラは、たとえば、レイジーをインスタンス化するためにクロージャを使用するときに、指定された明示的な戻り型から型を推測することはできませんvar、例えば 'lazy var first = {() - > FirstClassのFirstClass(s​​econd:self)}()')のようになります。 – dfri

+0

@dfri:お返事ありがとうございます。しかし、問題はサブクラス化とは無関係のようですが、私は例を追加しました。 –

関連する問題