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

How to do?I want a protocol that can only be followed by two classes

我想要一个protocol,后面只能跟两个类。(ClassA or ClassB).

protocol MyProtocol where Self: ClassA || ClassB {

}

这个要求几乎可以肯定表明存在设计问题。如果你的系统的任何部分关心什么在实现协议,那么协议就不会捕获整个接口。例如,如果您在任何时候使用 as? ClassA,那么这是对协议的危险使用。

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

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

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

private protocol MyProtocol {}

public class ClassA: MyProtocol {}

public class ClassB: MyProtocol {}

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

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

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
}

有了这个,不可能生成一个 MyStruct 除了 ClassAClassB.

或者,如果您真的是字面上的意思 "ClassA or ClassB" 那不是结构或协议。这是一个枚举:

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