将UnsafeMutableRawPointer强制转换为多种类型

时间:2019-02-19 14:36:47

标签: swift

我有两个class,它们都符合相同的protocol

class A {}
class B {}

protocol P {}

extension A: P {}
extension B: P {}

此外,我有一个回调闭包,其主要参数是传递给某些C API函数的UnsafeMutableRawPointer

SomeCFunction(…, …, { (pointerToEitherAOrB: UnsafeMutableRawPointer) in
  // Cast pointerToEitherAOrB to either A or B.
})

我不知道指针所指的是两个class中的哪个。仍然可以将此指针转换为正确的类型吗?

我的直觉告诉我这是不可能的,我将需要使用super class

1 个答案:

答案 0 :(得分:4)

使用通用的超类将是更清洁的方法,但是首先转换为AnyObject似乎也可以:

let aOrB = Unmanaged<AnyObject>.fromOpaque(pointerToEitherAOrB).takeUnretainedValue()
switch aOrB {
case let a as A:
    print(a)
case let b as B:
    print(b)
default:
    print("Something else")
}