2017-10-11 83 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在评论中所解释的那样,在一个已编译的项目中,其工作方式与预期的一样,即仅称为一次。

我仍然想知道为什么会发生在游乐场。所以如果有人有什么可以分享的,我想听听。

相关问题