如何在swift中使用非具体类型的泛型变量?

时间:2018-03-29 13:30:25

标签: swift generics swift-protocols

正如我从互联网和Xcode那里学到的,你不能做这样的事情:

protocol Foo {}

class Bar<T: Foo> {

}

class A {
    var some: Bar<Foo>! // this one
}

因为泛型变量的类型必须具体。如何绕过这个限制?最简单的方法似乎是使用其他协议,例如B,然后将Bar<Foo>更改为B,然后所有继承自Bar的类必须实现协议{{1但它似乎不太方便,所以可能是另一种方式?或者也许有人知道,Swift将来会支持不具体的仿制药吗?因为正如Kotlin所见,这不是可以在编程语言中完成的事情

1 个答案:

答案 0 :(得分:0)

我有一个例子,假设您想以一种不错的方式实现注入。

class Injectable<T: ServiceProtocol> {
  let type: ServiceProtocol.Type { return T.self }
  var value: T!
}

然后使用类似的东西

class ViewModel {
   let serviceA = Injectable<AbstractNetworkService>()
}

class DependencyProvider {
   ...
   func injectDependencies(into object: AnyObject) {
      // Here you would use a Mirror of object, go through every Injectable,
      // and set their values.
   }
}

这很好,因为您可以为AbstractNetworkService(协议)注册一个实际的类,但是Swift不允许您这样做。