от Objective- C до Swift 4 выполнить селектор - PullRequest
0 голосов
/ 31 марта 2020

Я новичок в Swing и Objective- C, и я пытался работать с AVCaptureDevice.

Я попытался реализовать следующий код, который возвращает мне частный член экземпляра AVCaptureDevice в Objective - C. Но я не могу передать ту же инструкцию в Swift:

CMIOObjectID connectionID;
AVCaptureDevice *main_cam = (AVCaptureDevice*)[cameras objectAtIndex:0];
connectionID = [main_cam performSelector:NSSelectorFromString(@"connectionID") withObject:nil];

В основном потому, что

main_cam.perform(NSSelectorFromString("connectionID"), with: nil) 

в Swift возвращает

Unmanaged<AnyObject>  

и не принять принудительное приведение к CMIOObjectID.

Можно ли выполнить операцию в Swift?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Использование @convention(c)

let selector = NSSelectorFromString("connectionID")
let methodIMP: IMP! = main_cam.method(for: selector)
let result: CMIOObjectID? = unsafeBitCast(methodIMP,to:(@convention(c)(Any?,Selector)-> CMIOObjectID?).self)(main_cam,selector) 

Подробнее об этом подходе в моем ответе здесь

0 голосов
/ 31 марта 2020

Вы можете попробовать:

let unmanaged = main_cam.perform(Selector(("connectionID")), with: nil)
if let connectionID = unmanaged?.takeUnretainedValue() as? CMIOObjectID {
    // do your thing
}

Вы можете прочитать о том, как использовать Unmanaged здесь .

...