首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖项注入pointfree.co.co-style:依赖项与依赖项?

依赖项注入pointfree.co.co-style:依赖项与依赖项?
EN

Stack Overflow用户
提问于 2021-07-25 18:15:35
回答 1查看 40关注 0票数 1

我真的对pointfree.co团队设计的/ talked about依赖注入模式很感兴趣,在这个模式中,您有一个Environment结构,它包含所有依赖项的可变属性。

简而言之,这个模式:

代码语言:javascript
复制
struct Environment {
  var analytics = Analytics()
  var date: () -> Date = Date.init
  var gitHub = GitHub()
}

var Current = Environment()

你可以看到他们的基本示例here,还有一个更大的here

我尝试做的是,能够拥有需要依赖项的依赖项。例如,需要网络提供商发布某些数据的Analytics跟踪器。

代码语言:javascript
复制
import Foundation

// MARK: - NetworkProvider

struct NetworkProvider {
  var postData = { (data: Data) in
    print("Data posted using the `NetworkProvider`")
  }
}

extension NetworkProvider {
  static let mock = NetworkProvider(
    postData: { data in
      print("Mock post!")
    }
  )
}


// MARK: - Tracker

struct Tracker {
  var networkProvider = NetworkProvider()

  var track = { (event: String) in
    print("Tracked: \(event)")
    let data = event.data(using: .utf8)!
    networkProvider.postData(data) // <- ERROR
  }
}

extension Tracker {
  static let mock = Tracker(
    networkProvider: .mock,
    track: { event in
      print("Mocked tracked: \(event)")
    }
  )
}


// MARK: - Environment

struct Environment {
  var networkProvider = NetworkProvider()
  var tracker = Tracker()
}

extension Environment {
  static let mock = Environment(
    networkProvider: .mock,
    tracker: .mock
  )
}

上面的代码没有编译:Instance member 'networkProvider' cannot be used on type 'Tracker',这完全有意义。我可以将networkProvider属性转换为static var,但是这样我就不能再传入模拟版本,所以这没有什么帮助。

我怎样才能使用这种依赖注入的方法,同时使需要依赖的依赖成为可能呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-25 19:54:15

不能直接访问计算属性中的self,但如果将其声明为lazy变量,则可以访问该属性

代码语言:javascript
复制
lazy var track = { [self] (event: String) in ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68517587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档