3

組み込みの ObjC ブリッジを備えたJXAは、オブジェクトFoundationを介してフレームワークから列挙と定数を自動的に公開します。$例えば:

$.NSUTF8StringEncoding  // -> 4

CFStringただし、自動的にインポートされない下位レベルの API にも便利な定数があります。つまり、頻繁に使用されるUTI値 ( UTIなど)を定義する のkUTType*定数です。CoreServiceskUTTypeHTML"public.html"

でそれらをインポートできますが、おそらくそのタイプが であるためObjC.import('CoreServices')、それらの文字列値CFString[Ref]に (簡単に) アクセスできません

ObjC.import('CoreServices') // import kUTType* constants; ObjC.import('Cocoa') works too
$.kUTTypeHTML  // returns an [object Ref] instance - how do you get its string value?

返されるものの中心に ある文字列を取得する方法をまだ見つけていObjC.unwrap($.kUTTypeHTML)ません。機能せず、どちらも機能しませんObjC.unwrap($.kUTTypeHTML[0])(または.deepUnwrap())。

私は疑問に思う:

  • これを行うためのネイティブの JXA の方法があれば、私は見逃しています。
  • それ以外の場合は、 toやなど、問題を解決できる関数ObjC.bindFunction()のバインディングを定義するために使用する方法がありませんが、ObjC 署名を変換する方法は私には明らかではありません。CFString*()CFStringGetCString()CFStringGetCStringPtr()
4

3 に答える 3

2

最初にCFMakeCollectable関数を再バインドして「void *」を取り、「id」を返し、その関数を使用して強制を実行することにより、CF型をNS型に強制できます。

ObjC.bindFunction('CFMakeCollectable', [ 'id', [ 'void *' ] ]);

var cfString = $.CFStringCreateWithCString(0, "foo", 0); // => [object Ref]
var nsString = $.CFMakeCollectable(cfString);            // => $("foo")

これをコードで使いやすくするために、 Ref プロトタイプで .toNS() 関数を定義できます。

Ref.prototype.toNS = function () { return $.CFMakeCollectable(this); }

この新しい関数を CFString 定数で使用する方法を次に示します。

ObjC.import('CoreServices')

$.kUTTypeHTML.toNS() // => $("public.html")
于 2016-01-26T04:33:38.253 に答える