这是一种可能的方法,编译时为相同类型生成错误,为不同类型传递错误。
class A {}
class B {}
class Foo<T1, T2> {
private init() {}
}
extension Foo where T1: A, T2: B {
convenience init(_ a: T1, _ b: T2) {
self.init()
}
}
extension Foo where T1: B, T2: A {
convenience init(_ b: T1, _ a: T2) {
self.init()
}
}
以及测试。。。
let test1 = Foo(A(), B())
let test2 = Foo(B(), A())
let test2 = Foo(A(), A()) // << Error: Ambiguous reference to initializer 'init(_:_:)'
let test2 = Foo(B(), B()) // << Error: Ambiguous reference to initializer 'init(_:_:)'
let test3 = Foo<String, String>() // Error: 'Foo<T1, T2>' initializer is inaccessible due to 'private' protection level
更新:Rob Napier评论