2017-10-11 5 views
0

私はプロトコル拡張でプライベート変数を作成し、それを使ってオブジェクトのインスタンスを取得しました。計算されたプロパティのゲッターが必要以上に呼び出されました

私がそれを一度呼び出すとしても、ゲッターは2回呼び出されます。私はそれを示すためにプレイグラウンドを用意しました。

以下

はコードです:

class LoggingService { 
    func sayWorld() { 
     print("world") 
    } 
} 

protocol LoggerType { 
    func sayWorld() 
} 

extension LoggerType { 
    private var loggerInstance: LoggingService { 
     print("init") 
     return LoggingService() 
    } 

    func sayWorld() { 
     self.loggerInstance.sayWorld() 
    } 
} 

class ViewMock: LoggerType { 
    init() { 

    } 
} 

let viewObj = ViewMock() 
viewObj.sayWorld() 

は、この動作にいくつかの説明が必要で実行遊び場

enter image description here

を見てください。

+0

遊び場で奇妙なスウィフト動作をデバッグするステップ1は、遊び場を使用していません。コンパイルされたプロジェクトでは、ゲッターは期待どおりに1回しかアクセスされません。 – Hamish

+0

@Hamishは応答に感謝します。それは確かに事実でした。なぜAppleがそのようなことをするのか分かりません。 – kerry

+1

私が推測しなければならないのは、右側のサイドバーにその説明を表示するために、プレイグラウンドが 'loggedInstance'をさらに実行しているからです。サイドバーが式の空白の結果を代わりに表示するように '_ = self.loggerInstance.sayWorld()'に変更することができ、それは一度だけ呼び出されることがわかります。 – dan

答えて

0

@Hamishのコメントで説明したように、コンパイルされたプロジェクトでは、期待どおりに動作します。つまり、これは1回だけと呼ばれます。

私はまだこれがプレイグラウンドで起こる理由を知りたいと思います。だから、誰かが分かち合うものがあれば、聞いてみたい。

関連する問題