Swift Self作为绑定在协议中的关联类型

问题描述:

我想强制关联类型为Self,但编译器没有它。
这里就是我想要去编译:Swift 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 
    } 
} 

我想Classtypealias触发重新声明错误或相似。

+0

错误消息是绝对正确的。用你的话来说明问题的根源:“关联类型是从父协议继承的”。不,它不是。协议不做“继承”。你似乎无法像另一个协议那样“覆盖”一个协议。你要么采用协议,要么你不这样做。 – matt

+0

“我想在类中的typealias触发重新声明错误或类似的”你不能防止超载! 'f() - > Int'和'f() - > String'可以在Swift*存。你在问语言是不同的语言。你不是编译器。换句话说,采用协议并不妨碍我实施协议所不需要的其他方法! – matt

+0

目前还不清楚你想要什么,为什么。什么会让你满意?也许你最好的选择是有两个_unrelated_协议,Factory和SelfFactory。我只采用它们。 _that_会让你开心吗? (但是当然,即使那样你也不能阻止我采用他们两个,如果我觉得这样的话)。 – matt

你想说这个吗?

protocol Factory { 
    associatedtype MyType 
    func new() -> MyType 
} 

protocol SelfFactory: Factory { 
    func new() -> Self 
} 
+0

这几乎是我所追求的。我编辑了更多细节的问题。谢谢回答! – ThinkChaos

+0

在花费更多时间与此抗争之后,我相信这是目前最好的解决方案。我希望能够说'SelfFactory'的'Factory'的实现是“最终的”,但我想这不会发生。不得不重复每个功能定义都很烦人,但是哦。 – ThinkChaos

+0

实际上,如果我将'SelfFactory'定义为空协议,并在扩展中实现'new'方法,这仍然可行。 – ThinkChaos

我意识到这是一个老问题,但你可以做到这一点作为Swift 4.0

protocol Factory { 
    associatedtype MyType 
    static func new() -> MyType 
} 

protocol SelfFactory: Factory where MyType == Self { } 

是不是where子句很大?