2017-10-11 80 views
0

我在協議擴展中創建了一個私有變量,並使用它來獲取對象的一個​​實例。在協議中調用的屬性getter被調用的次數超過所需的次數

即使我打過一次電話,該吸氣劑被調用兩次。我準備了一個遊樂場來表明這一點。

下面是代碼:

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

調試怪異的第一步操場上的Swift行爲不使用操場。在編譯的項目中,只能按預期訪問一次getter。 – Hamish

+0

@哈米什謝謝你的迴應。事實確實如此。我不知道蘋果爲什麼會這麼做。 – kerry

+1

如果我不得不猜測,我會說這是因爲遊樂場正在執行'loggedInstance'一段時間,以便在右邊的邊欄中顯示它的描述。您可以將其更改爲'_ = self.loggerInstance.sayWorld()',以便側欄顯示錶達式的無效結果,您將看到它只被調用一次。 – dan

回答

0

正如@Hamish在評論中所解釋的那樣,在一個已編譯的項目中,其工作方式與預期的一樣,即僅稱爲一次。

我仍然想知道爲什麼會發生在遊樂場。所以如果有人有什麼可以分享的,我想聽聽。

相關問題