为一个或另一个扩展具有多个约束的协议-Swift

时间:2018-07-03 08:46:51

标签: ios swift protocols

我想使用满足OR(||)约束的默认实现扩展协议。

class A { }
class B { }

protocol SomeProtocol { }

/// It will throw error for || 
extension SomeProtocol where Self: A || Self: B { 
}

1 个答案:

答案 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()