这不是一个重复的原因与懒惰我也有一个问题: " C函数指针不能由捕获上下文"
的闭包形成在我的主要课程中,我有" detectChangeMidi"但在这段代码中,当我尝试调用一个函数时,我不明白为什么我不能。 (我也不能使用var,我班上的任何东西)
我不是迅速的专家,然后试着向我解释一下是什么。 我使用的是CoreMidi图书馆。
更新:
我用minimaliste代码替换代码以获得更好的信息。
import Foundation
import CoreMIDI
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
gestionMidi()
//...
}
func gestionMidi() {
//...
let midiNotif:MIDINotifyProc = detectChangeMidi
MIDIClientCreate("Swift3 Test Client" as CFString, midiNotif, nil, &midiClient)
//...
}
func plop(){
print("bla bla bla")
}
let detectChangeMidi: @convention(c) (UnsafePointer<MIDINotification>, UnsafeMutableRawPointer?) -> Swift.Void =
{ midiNotification,unkown in
var notification = midiNotification.pointee
self.plop() //problem here
//...
}
}
答案 0 :(得分:1)
这里的整个议程都是错误的;你可以尝试做什么并不明显。您不能将属性或函数声明为convention(c)
,也可以引用self
。但你不需要!如果您的目标是将函数作为参数传递给C指向函数的函数,那么只需传递函数即可。无论如何,如果你打电话给MIDIClientCreateWithBlock(_:_:_:)
,你将在Swift中度过更轻松的时光。
答案 1 :(得分:0)
问题在于我可以从错误消息中判断范围。
另外要注意的是你在关闭时执行plop()
,这需要self.plop()
。
midiNotification,unkown in
- unkown
似乎也是一个错字。
检查声明函数本身的位置。从这个片段中很难理解你的申报范围是什么。