2

スクリプトがバンドルとして保存されると、localized stringコマンドを使用して適切な文字列を見つけることができますContents/Resources/English.lproj/Localizable.strings。これがフォーマット文字列の場合、プレースホルダーを埋める最良の方法は何ですか? 言い換えれば、AppleScript に相当するものは何+[NSString stringWithFormat:]ですか?

私が持っていた 1 つのアイデアは、 で使用することdo shell scriptでしたprintf(1)。より良い方法はありますか?

4

2 に答える 2

2

OS X 10.10 以降、AppleScript スクリプトで Objective-C を使用できるようになりました。この翻訳ガイドで詳しく説明されているように、AppleScript 内から Objective-C メソッドを呼び出す方法はいくつかあります。私のような Objective-C 開発者は、メソッドのパラメーターをその値で補間する次の構文に引き寄せられます。

use framework "Foundation"

tell the current application's NSWorkspace's sharedWorkspace to openFile:"/Users/me/Desktop/filter.png" withApplication:"Preview"

結果:

true

+[NSString stringWithFormat:]トリッキーなケースです。最初のパラメーターとして vararg リストを使用するため、書式文字列とその引数の両方を同じメソッド パラメーターに強制する何らかの方法が必要です。AppleScript は、概念的には NSString の C 配列を想定しているパラメーターに単一の NSArray を渡すことになるため、次の結果はエラーになります。

use framework "Foundation"

the current application's NSString's stringWithFormat:{"%lu documents", 8}

結果:

error "-[__NSArrayM length]: unrecognized selector sent to instance 0x7fd8d59f3bf0" number -10000

代わりに、Objective-C メッセージよりも AppleScript ハンドラ呼び出しに似た代替構文を使用する必要があります。また、戻り値 (NSString オブジェクト) を次のように強制する必要がありますtext

use framework "Foundation"

the current application's NSString's stringWithFormat_("%lu documents", 8) as text

結果:

"2087 documents"

@nlanza が言及している「with parameters」構文は、AppleScript が内部でNSInvocationに似たものを使用しているという事実を示しています。Objective-C では、NSInvocation を使用すると、各値を特定のパラメーターに必ずしも一致させることなく、パラメーター値の配列と共にメッセージをオブジェクトに送信できます。( NSInvocation を直接使用する例については、この記事を参照してください。)

于 2016-12-31T04:57:48.463 に答える
0

それは醜いですが、に呼びかけることがprintf(1)一般的な解決策です。

やや複雑ではありますが、よりクリーンなソリューションは、AppleScript Studio を使用することです。これにより、AppleScript コードから目的の C オブジェクト/クラスを呼び出すことができcall methodます。

これで、次のようなものを使用できるようになります。

call method "stringWithFormat:" of class "NSString" with parameters {formatString, arguments}

もちろん、これの欠点は、単純なスクリプトを作成するだけでなく、AppleScript Studio アプリを作成する必要があることです。ただし、Studio アプリを使用すると、一般的にかなりの柔軟性が得られるため、すべてを一緒に行うのはひどいルートではありません.

于 2008-09-15T20:58:52.517 に答える