Swift Self作为协议

时间:2016-08-20 20:39:42

标签: swift generics type-constraints associated-types

我想强制关联的类型为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触发重新声明错误或类似错误。

2 个答案:

答案 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 { }

不是哪个条款好吗?