![](/img/trans.png)
[英]performSelector from swift to objc with selector parameter not work
[英]swift @objc and selector : compiler error with type returned from selector
在 MacOS 10.14.6、Swift 和 XCode 11.0、VLCKit 3.3.0 上,我嘗試在 ZA2F2ED4F8EBC2CBB14C21A29DC4 中使用 @objc 函數創建回調。 但是使用#selector 指向我的@objc func,編譯器會產生錯誤
這些是我在 class 中聲明的 2 個函數
class VLCStreamProcessor {
// ...
@objc func lock_frame(
opaque: UnsafeMutableRawPointer? ,
planes: UnsafeMutablePointer<UnsafeMutableRawPointer?>?)
-> UnsafeMutableRawPointer?
{ // ...
return UnsafeMutableRawPointer(user_data.pic)
}
@objc func unlock_frame(
opaque: UnsafeMutableRawPointer?,
picture: UnsafeMutableRawPointer?,
planes: UnsafePointer<UnsafeMutableRawPointer?>?)
{ // ...
}
然后在另一個 function (myVLCProcessing) 中,仍然在同一個 class 內,我准備回電
func myVLCProcessing()
{ // ...
libvlc_video_set_callbacks(
mplayerPtr, // type libvlc_media_player_t*
#selector( lock_frame(opaque:planes:) ), // type libvlc_video_lock_cb <- 1st error
#selector( unlock_frame(opaque:picture:planes: )), // type libvlc_video_unlock_cb <- 2nd error
0, // type libvlc_video_display_cb
opaque // type void*
)
// ...
}
在那里我得到一個編譯器錯誤,在 #selector: first 的 2 行:
Cannot convert value of type 'Selector' to expected argument type 'libvlc_video_lock_cb?' (aka 'Optional<@convention(c)(Optional<UnsafeMutableRawPointer>, Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>) -> Optional<UnsafeMutableRawPointer>>')
第二:
Cannot convert value of type 'Selector' to specified type 'libvlc_video_unlock_cb' (aka '@convention(c) (Optional<UnsafeMutableRawPointer>, Optional<UnsafeMutableRawPointer>, Optional<UnsafePointer<Optional<UnsafeMutableRawPointer>>>) -> ()')
從 libvlc (libvlc_media_player.h) 中,2 個 C 函數預計為:
typedef void *(*libvlc_video_lock_cb)(void *opaque, void **planes);
typedef void (*libvlc_video_unlock_cb)(void *opaque, void *picture,
void *const *planes);
歡迎任何建議。
只有全局函數或閉包(不捕獲上下文)可以傳遞給 C function 用於回調 arguments。 與如何使用實例方法作為 function 的回調類似,它只接受 func 或文字閉包,您可以通過將self
(指向實例的指針)轉換為void
指針並返回來“隧道”到回調函數。 回調 function 然后可以調用實例方法:
class VLCStreamProcessor {
func lock_frame(
planes: UnsafeMutablePointer<UnsafeMutableRawPointer?>?)
-> UnsafeMutableRawPointer?
{ // ...
}
func unlock_frame(
picture: UnsafeMutableRawPointer?,
planes: UnsafePointer<UnsafeMutableRawPointer?>?)
{ // ...
}
func myVLCProcessing() {
// ...
let opaque = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
libvlc_video_set_callbacks(mplayerPtr, { (opaque, planes) -> UnsafeMutableRawPointer? in
let mySelf = Unmanaged<VLCStreamProcessor>.fromOpaque(opaque!).takeUnretainedValue()
return mySelf.lock_frame(planes: planes)
}, { (opaque, picture, planes) in
let mySelf = Unmanaged<VLCStreamProcessor>.fromOpaque(opaque!).takeUnretainedValue()
mySelf.unlock_frame(picture: picture, planes: planes)
}, nil, opaque)
}
}
這里假設只要設置了 libvlc 回調, VLCStreamProcessor
存在,否則必須保留指針。
選擇器與 C 函數不同。 您需要提供一個閉包或 function 指針。
只需嘗試刪除您提供的函數周圍的#selector()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.