正如我从互联网和Xcode那里学到的,你不能做这样的事情:
protocol Foo {}
class Bar<T: Foo> {
}
class A {
var some: Bar<Foo>! // this one
}
因为泛型变量的类型必须具体。如何绕过这个限制?最简单的方法似乎是使用其他协议,例如B
,然后将Bar<Foo>
更改为B
,然后所有继承自Bar
的类必须实现协议{{1但它似乎不太方便,所以可能是另一种方式?或者也许有人知道,Swift将来会支持不具体的仿制药吗?因为正如Kotlin所见,这不是可以在编程语言中完成的事情
答案 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不允许您这样做。