怎么办?我想要一个只能跟随两个类的协议

时间:2018-10-13 13:11:03

标签: swift protocols where

我想要一个protocol,只能跟随两个类。(ClassAClassB)。

protocol MyProtocol where Self: ClassA || ClassB {

}

1 个答案:

答案 0 :(得分:4)

这个要求几乎可以肯定表明了设计问题。如果系统的任何部分都在乎实现协议的内容,那么该协议将无法捕获整个接口。例如,如果您随时使用as? ClassA,那么使用协议是危险的。

在Swift中,不可能有我可以看到但无法实现的协议。像Go这样的语言是可能的(尽管仍然不是您所描述的那样),但是在当今的Swift中这是不可能的。正如@MartinR所指出的,J。Doe的答案实际上并没有改变任何东西。外部各方仍然可以仅实现这两个协议。

话虽如此,有可能实现与您所描述的非常相似的事情。

首先,也是最明显的:使用访问控制。

private protocol MyProtocol {}

public class ClassA: MyProtocol {}

public class ClassB: MyProtocol {}

如果所有类和协议都在一个文件中,则此方法有效。如果不是,请将它们全部放在框架中并使用internal而不是private。现在,此文件/模块之外的任何内容都无法实现MyProtocol。限制是MyProtocol在文件/模块之外也看不到。

这可以通过提升结构来解决:

public struct MyStruct: MyProtocol {
    private let value: MyProtocol
    public init(classA: ClassA) { value = classA }
    public init(classB: ClassB) { value = classB }
    // Methods to conform to MyProtocol by forwarding to value
}

这样,就不可能生成MyStructClassA以外的任何内容初始化的ClassB

或者,如果您真正的意思是“ ClassA或ClassB”,则它不是结构或协议。这是一个枚举:

enum MyEnum {
    case classA(ClassA)
    case classB(ClassB)
}