![](/img/trans.png)
[英]objective-c type encoding in printf / string with format in macro
[英]Parse Objective-C printf Format Strings?
我想獲得使用+[NSString stringWithFormat:]
構建的NSString
的成員范圍。 解析objective-c格式字符串的最佳方法是什么? 因為%@
我不能只使用C格式的字符串解析器。 我還需要確保它支持格式排序: %1$d
, %2$@
等。
例如,使用[NSString stringWithFormat:@"foo %2$@ bar %1$@", @"Heath", @"Borders"]
構建的字符串,我理想地喜歡以下NSArray
: @[NSMakeRange(15, 5), NSMakeRange(4, 6)]
。 第一個數組對象對應於格式字符串中的第一個數據元素,第二個數組元素對應於第二個數據元素等。
在這種情況下,API看起來像+ (NSString *) stringWithFormatRanges:(NSArray **)outFormatRanges withFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
它將返回一個NSString
,就像+[NSString stringWithFormat:]
,但它也會返回一個NSArray
, NSRange
包含每個格式數據元素的NSRange
。
- 編輯 -
鑒於這個問題已經有3年了,我現在很滿意只有C語言的實現。
幾年前我對此進行了研究。 如果我理解你的問題,就沒有簡單的方法可以從C或Cocoa格式字符串的格式字符串中獲取AST。
我編寫了NSXMLElement + elementWithXMLFormat,它允許將NSXMLElements非轉義插入到帶有特殊%%%@
格式代碼的格式字符串中,這需要擴展Cocoa的格式。 我的技術可能對您有所幫助:
我提取和NUL分隔格式代碼,傳統運行然后重新組裝。
我寫了一個解析器對於那些在斯威夫特(這樣我就可以檢測那些占位符Localizable.strings
其預計類型的電話可給予和提取stringWithFormat:
與這些字符串)我的工具SwiftGen
您可以在我的GitHub上看到代碼的一部分進行解析。
typesFromFormatString
函數中的代碼肯定可以訪問這些占位符的范圍,並且除了檢測到的類型之外可以完全返回它們(這很容易改變,我只是不需要那些范圍所以我沒有將它們包含在返回類型中) (一旦你有像%d
或%2$@
這樣的占位符的范圍,就可以很容易地推斷出字符串參數的范圍:第一個范圍將具有與第一個占位符相同的.location
但是長度為替換值時,第二范圍將有.location
的第二占位符+(firstValue.length-firstRange.length)的取偏移考慮在內,等)
HTH。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.