我想强制关联的类型为Self
,但编译器没有。{
这就是我想要编译的内容:
protocol Protocol {
// Error: Inheritance from non-protocol, non-class type 'Self'
associatedtype Type: Self
}
您可能会问,为什么不使用Self
而不是关联类型?仅仅因为我不能:关联类型是从父协议继承的。在父协议中改变它是没有意义的
这是类似于我尝试做的事情:
protocol Factory {
associatedtype Type
func new() -> Type
}
protocol SelfFactory: Factory {
associatedtype Type: Self // Same Error
}
编辑:
亚马的回答几乎就是我所寻找的。它在运行时表现得像我想要的那样,但在编译时不够严格
我希望这是不可能的:
protocol Factory {
associatedtype MyType
static func new() -> MyType
}
protocol SelfFactory: Factory {
static func new() -> Self
}
final class Class: SelfFactory {
// Implement SelfFactory:
static func new() -> Class {
return Class()
}
// But make the Factory implementation diverge:
typealias MyType = Int
static func new() -> Int {
return 0
}
}
我希望typealias
中的Class
触发重新声明错误或类似错误。
答案 0 :(得分:3)
你想说这个吗?
protocol Factory {
associatedtype MyType
func new() -> MyType
}
protocol SelfFactory: Factory {
func new() -> Self
}
答案 1 :(得分:3)
我意识到这是一个老问题,但您可以从Swift 4.0开始执行此操作:
protocol Factory {
associatedtype MyType
static func new() -> MyType
}
protocol SelfFactory: Factory where MyType == Self { }
不是哪个条款好吗?