Преобразование UnsafeMutableRawPointer в несколько типов - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть два class es, которые оба соответствуют одному и тому же protocol:

class A {}
class B {}

protocol P {}

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

Кроме того, у меня есть закрытие обратного вызова, основным аргументом которого является переданный UnsafeMutableRawPointerв какой-то функции C API:

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

Я не знаю, к какому из двух class относится указатель.Будет ли еще возможно привести этот указатель к правильному типу?

Моя интуиция говорит мне, что это невозможно, и что мне нужно будет использовать super class.

1 Ответ

0 голосов
/ 19 февраля 2019

Использование общего суперкласса было бы более чистым подходом, но преобразование в 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")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...