错误调用函数(不能使用实例成员)

时间:2017-11-08 10:32:07

标签: swift function swift3

这不是一个重复的原因与懒惰我也有一个问题: " 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
        //...
    }
}

2 个答案:

答案 0 :(得分:1)

这里的整个议程都是错误的;你可以尝试做什么并不明显。您不能将属性或函数声明为convention(c),也可以引用self。但你不需要!如果您的目标是将函数作为参数传递给C指向函数的函数,那么只需传递函数即可。无论如何,如果你打电话给MIDIClientCreateWithBlock(_:_:_:),你将在Swift中度过更轻松的时光。

答案 1 :(得分:0)

问题在于我可以从错误消息中判断范围。

另外要注意的是你在关闭时执行plop(),这需要self.plop()

midiNotification,unkown in - unkown似乎也是一个错字。

检查声明函数本身的位置。从这个片段中很难理解你的申报范围是什么。