我正在尝试做一些用于依赖注入的协议组合,但我遇到了一个问题,我怀疑可能没有我想要的解决方案,但我看不到逻辑原因:
protocol DM1 {
func sayHi() -> Void
}
protocol DM2 {
func sayHello() -> Void
}
protocol VM1 {
typealias T: DM1
var dm: T { get }
}
protocol VM2 {
typealias T: DM2
var dm: T { get }
}
protocol RT: VM1, VM2 {
}
class James {
let rt: RT
init(rt: RT) {
self.rt = rt
}
}
上面的代码在实例变量和实例化参数上导致错误“协议'RT'只能用作通用约束,因为它具有自身或关联的类型要求” 。我真的不明白为什么我不能在课堂上使用这个通用要求。rt
James
James
我最初做了如下的事情:
protocol DM1 {
func sayHi() -> Void
}
protocol DM2 {
func sayHello() -> Void
}
protocol VM1 {
var dm: DM1 { get }
}
protocol VM2 {
var dm: DM2 { get }
}
protocol RT: VM1, VM2 {
}
struct Fred: DM1, DM2 {
func sayHi() {
println("hi")
}
func sayHello() {
println("hello")
}
}
struct Bob: RT {
let dm: Fred
}
class James {
let rt: RT
init(rt: RT) {
self.rt = rt
}
}
但这失败了,因为“类型'Bob'不符合协议'VM1' ”(和VM2
)我可以理解,因为我的协议要求变量是特定协议类型而不是某些符合该协议的实例类型协议。因此,上述版本旨在解决此问题。
有没有人对我想做的事情有解决方案(能够通过将一个同时符合and的具体结构RT
作为dm
属性来制作符合的具体结构)?DM1
DM2