我想使用满足OR(||)约束的默认实现扩展协议。
class A { }
class B { }
protocol SomeProtocol { }
/// It will throw error for ||
extension SomeProtocol where Self: A || Self: B {
}
答案 0 :(得分:4)
您不能使用OR扩展协议,因为您无法在if let中完成它,因为编译器以此推断出self或var的类型,因此,如果它符合2种类型,则编译器不会不知道自己是什么类型。
(当您键入self。或任何var时,编译器始终知道编译器类型中的var类型,在这种情况下,它将在运行时中)。因此,最简单的方法是使这两种类型符合协议并对该协议进行扩展。因此,编译器知道self符合协议,并且他并不关心Self的确切类型(但是您将只能使用协议中声明的属性)。
protocol ABType {
// Properties that you want to use in your extension.
}
class A: ABType, SomeProtocol { }
class B: ABType, SomeProtocol { }
protocol SomeProtocol { }
extension SomeProtocol where Self: ABType {
}
此外,如果要将扩展名同时应用于这两种类型,则必须一个接一个地进行。
extension A: SomeProtocol { }
extension B: SomeProtocol { }
//愚蠢的例子: (在这种情况下,这并不是真正有用的方法,它只是说明如何使2个类符合协议,并使用该协议中声明的方法并创建默认实现来对其进行扩展。)
protocol ABType {
func getName()
}
class AClass: ABType {
func getName() {
print ("A Class")
}
}
class BClass: ABType, someProtocol {
func getName() {
print ("B Class")
}
}
protocol someProtocol {
func anotherFunc()
}
extension someProtocol where Self: ABType {
func anotherFunc() {
self.getName()
}
}
let a = AClass()
// a.anotherFunc() <- Error, A cant call anotherFunc
let b = BClass()
b.anotherFunc()