【发布时间】:2018-04-21 00:01:07
【问题描述】:
这不是懒惰的重复原因,我也有一个问题: “不能从捕获上下文的闭包中形成 C 函数指针”
在我的主类中,我有“detectChangeMidi”,但在这段代码中,当我尝试调用一个函数时,我不明白为什么我不能。 (我也不能使用 var,我班的任何东西)
我不是 swift 方面的专家,然后尝试向我解释发生了什么。 我使用 CoreMidi 库。
更新:
我用极简代码替换代码以获得更好的意图。
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
//...
}
}
【问题讨论】:
-
你不能在实例属性声明中引用 self。
-
没有self.,我也有一个问题:实例成员'plop'不能用于'ViewController'类型;您的意思是改用这种类型的值吗?
-
@matt 而且它不是重复的,如果我使用“lazy var ...”我也有一些问题
-
即使你没有明确地说
self,你也隐含地指代了self。你不能这样做。它是重复的;这是完全相同的规则。唯一的区别是您的初始化程序是一个匿名函数体。您可以轻松地将其简化为一个非常简单的测试用例,如下所示:class MyClass { func myMethod() {}; let myProperty = { myMethod() } }这就是您正在做的事情,这是非法的。这是有据可查的。 -
您是对的,您不能将
lazy用于C 函数指针。但是,只需以其他方式表达这个 C 函数指针——而不是作为实例属性。无论如何,convention(c)适用于 types,而不适用于 declarations,因此您要做什么并不明显。如果您尝试调用convention(c)函数,只需调用它即可。如果您尝试编写convention(c)函数,则必须用 C 编写它。