Я обнаружил кое-что странное при попытке использовать спецификаторы ширины с %@
. Они отлично работают в NSLog
, но не в NSString stringWithFormat:
.
Пример:
NSString *rightAligned = @"foo";
NSString *leftAligned = @"1";
NSLog(@"| %15@ | %-15@ |", rightAligned, leftAligned);
И вы получите ожидаемый результат:
| foo | 1 |
Но замените NSLog
на stringWithFormat:
:
NSString *test = [NSString stringWithFormat:@"| %15@ | %-15@ |", rightAligned, leftAligned];
И значение test
неверно:
| foo | 1 |
Если я изменю это, чтобы использовать %s
и cStringUsingEncoding:
, тогда это сработает:
NSString *test2 = [NSString stringWithFormat:@"| %15s | %-15s |", [rightAligned cStringUsingEncoding:NSUTF8StringEncoding], [leftAligned cStringUsingEncoding:NSUTF8StringEncoding]];
Результат такой же, как с NSLog
.
Что делает это действительно странным, так это то, что NSLog
в основном просто оболочка вокруг NSString stringWithFormat:
.
Так почему разные результаты? Почему спецификаторы формата не учитываются для %@
в stringWithFormat
, но они учитываются в NSLog
?
В качестве примечания: инициализатор Swift String init(format:)
имеет ту же проблему со спецификаторами %@
и ширины.