【发布时间】:2015-08-06 14:15:18
【问题描述】:
我正在尝试做一些用于依赖注入的协议组合,但我遇到了一个问题,我怀疑可能没有我想要的解决方案,但我看不到逻辑原因:
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 实例变量和实例化参数上导致错误“Protocol 'RT' can only be used as a generic constraint because it has Self or associated type requirements” 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)我可以理解,因为我的协议要求变量是特定的协议类型,而不是符合该协议的某些实例类型。因此,上述版本旨在解决这个问题。
是否有人对我想做的事情有解决方案(能够通过将符合dm 属性的具体结构作为DM1 和DM2 来制作符合RT 的具体结构)?
【问题讨论】:
标签: swift generics swift-protocols