2017-11-08 10 views
0

それは怠惰と重複の原因ではありません、私はあまりにもISSUを持っている: 「AC関数ポインタは、コンテキストをキャプチャ閉鎖から形成することができない」エラーコール機能(インスタンスメンバを使用することはできません)

私のメインのクラスではI "detectChangeMidi"がありますが、このコードでは、関数を呼び出そうとすると、なぜ私は理解できません。 (私もvarを使用することはできません、私のクラスの何でも)

私は迅速にエキスパートではなく、次に何が起こっているのかを説明しようとしています。 私はCoreMidiライブラリを使用しています。

UPDATE:

私はより良いentendementため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

インスタンスプロパティ宣言でselfを参照することはできません。 – matt

+0

自分ではなく、私もissuを持っています:インスタンスメンバー 'plop'は 'ViewController'タイプでは使用できません。代わりにこのタイプの値を使用することを意味しましたか? – KasaiJo

+0

@matt "lazy var ..."を使うと重複しません。いくつかの問題もあります。 – KasaiJo

答えて

1

あなたの議題全体が誤っています。あなたがしようとすることができることはまったく明らかではありません。プロパティまたは関数をconvention(c)と宣言することはできません。selfも参照してください。しかし、あなたはする必要はありません!あなたの目標が、C関数へのポインタが期待されるパラメータとして関数を渡すことであれば、その関数を渡すだけです。とにかくMIDIClientCreateWithBlock(_:_:_:)に電話すると、スウィフトでもっと簡単に時間を過ごすことができます。

+0

あなたは '@convention(c)(arg_types ...) - > return_type'型のプロパティを宣言できますが、コンテキストをキャプチャすることはできません。つまり、 'self'を使用することはできません。 https:// stackoverflowの複製のように見えます。com/q/33260808/1187415 –

+0

@MartinR Whoa。いつものようにありがとう。そのために提出されたバグはありますか?しかし、私はまだOPがそのようなプロパティを宣言する必要はないと思っています。そして、時代遅れの 'MIDIClientCreate(_:_:_:)の代わりに' MIDIClientCreateWithBlock(_:_:_ :) ' _ :) '。 – matt

+0

どのようなバグですか? MIDIClientCreate()はC関数のコールバックを取ります。リテラルクロージャ、グローバル関数、または(ここでは)convention(c)クロージャを渡すことができます。しかし、Cのコールバックはコンテキストを捕捉することができません(単に関数ポインタなので)。 - あなたはMIDIClientCreateWithBlockで正しいです、それはコンテキストを取得できるブロックをとります。 –

0

エラーメッセージから判断できる範囲に問題があります。

また、注意が必要なのは、plop()を実行中であり、それにはself.plop()が必要です。

midiNotification,unkown in - unkownはタイプミスのようです。

関数自体を宣言する場所を確認します。このスニペットから、宣言のスコープが何かを理解することは難しいです。

+0

メインポストで自分のコードを更新します。何が起こっているのかを理解する方が良いでしょうか? フォームの場合:MIDINotifyProc =(UnsafePointer 、UnsafeMutableRawPointer?) - > Void – KasaiJo

関連する問題