在Swift中为两个不同的协议进行转换

thy*_*all 0 swift

Objective-C中,我有以下声明:

id<Protocol1, Protocol2> myVar = (id<Protocol1, Protocol2>) [someObject getMyVar];
Run Code Online (Sandbox Code Playgroud)

该声明myVar分为两种不同的协议.如何在Swift中实现相同的结果?

Mar*_*n R 6

您可以使用协议组合的可选绑定:

if let myVar = someObject.getMyVar() as? protocol<Protocol1, Protocol2>   {
    // `myVar` has the type `protocol<Protocol1, Protocol2>`
    // ...
} else {
    // returned value does not conform to Protocol1 and Protocol2.
}
Run Code Online (Sandbox Code Playgroud)

小自包含的例子:

protocol P1 { }
protocol P2 { }

func test(obj : Any) {
    if let p = obj as? protocol<P1, P2> {
        print("yes")
    } else {
        print("no")
    }
}

struct A { }
struct B : P1 { }
struct C : P2 { }
struct D : P1, P2 { }

test(A()) // no
test(B()) // no
test(C()) // no
test(D()) // yes
Run Code Online (Sandbox Code Playgroud)