2008-09-15 144 views
1

將腳本保存爲捆綁包時,可以使用localized string命令查找相應的字符串,例如,在Contents/Resources/English.lproj/Localizable.strings。如果這是一個格式字符串,填充佔位符的最佳方式是什麼?換句話說,什麼是+[NSString stringWithFormat:]的AppleScript等價物?在AppleScript中格式化本地化字符串的最佳方式是什麼?

我想到的一個想法是使用do shell scriptprintf(1)。有沒有更好的辦法?

回答

1

Since OS X 10.10,任何AppleScript腳本都可以使用Objective-C。在AppleScript中有幾種方法可以調用Objective-C方法,詳見this translation guide。像我這樣的一個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:]是一個棘手的情況。它將可變參數列表作爲其第一個參數,因此您需要某種方式將格式字符串及其參數強制爲同一個方法參數。在一個錯誤的結果如下,因爲AppleScript的最終傳遞一個單一的NSArray成期望,概念上的參數,NSString的的C數組:

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提到指向一個事實,語法AppleScript的是在引擎蓋下使用類似NSInvocation的東西。在Objective-C中,NSInvocation允許您向對象發送消息以及參數值數組,而不必將每個值與特定參數進行匹配。 (有關直接使用NSInvocation的一些示例,請參閱this article)。

0

儘管醜陋,但呼叫printf(1)是常見的解決方案。

一個更簡潔,雖然稍微複雜的解決方案是使用AppleScript Studio,它允許您從AppleScript代碼中調用Objective-C對象/類,call method語法記錄爲here

就這樣,你可以使用這樣的事情:

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

這種方法的缺點,當然,是你需要編寫一個AppleScript Studio的應用,而只寫一個簡單的腳本。儘管如此,您在Studio應用程序中通常會獲得更多的靈活性,因此這並不是一條可怕的路線。

+0

不幸的是,有些情況下需要腳本而不是應用程序,所以AppleScript Studio不是一個選項。 – 2008-09-15 21:22:24

+0

AppleScript Studio現在已被棄用。 – 2010-05-09 16:05:59

相關問題