我想要一个protocol
,只能跟随两个类。(ClassA
或ClassB
)。
protocol MyProtocol where Self: ClassA || ClassB {
}
答案 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
}
这样,就不可能生成MyStruct
或ClassA
以外的任何内容初始化的ClassB
。
或者,如果您真正的意思是“ ClassA或ClassB”,则它不是结构或协议。这是一个枚举:
enum MyEnum {
case classA(ClassA)
case classB(ClassB)
}