В соответствии со спецификацией :
Каждая спецификация преобразования вводится символом '%' или последовательностью символов "% n $", после чегопоявляются в последовательности:
Ноль или более флагов (в любом порядке), которые изменяют значение спецификации преобразования.
Необязательный минимумширина поля.Если преобразованное значение имеет меньше байтов, чем ширина поля, оно должно быть дополнено пробелами по умолчанию слева;он дополняется справа, если для ширины поля указан флаг регулировки слева ('-'), описанный ниже.Ширина поля принимает форму звездочки ('*'), описанной ниже, или десятичного целого числа.
Необязательная точность, которая дает минимальное количество цифр для отображения, i, o, u, x и X спецификаторы преобразования;количество цифр после радикального символа для спецификаторов преобразования a, A, e, E, f и F;максимальное количество значащих цифр для спецификаторов преобразования g и G;или максимальное количество байтов, которое будет напечатано из строки в спецификаторах преобразования s [XSI] [Option Start] и S [Option End].Точность принимает форму точки ('.'), За которой следует звездочка ('*'), описанная ниже, или необязательная строка десятичных цифр, где строка с нулевыми цифрами рассматривается как ноль.Если точность появляется с любым другим спецификатором преобразования, поведение не определено.
Необязательный модификатор длины, который определяет размер аргумента.
Символ спецификатора преобразования, указывающий тип применяемого преобразования.
Мы используем преобразование первого типа, поскольку здесь нет знака доллара.Обратите внимание на слова в последовательности в верхней части списка выше.@
- это символ спецификатора преобразования (как упоминалось здесь ), который указывает, что мы должны получить доступ к значению, переданному как NSObject
, и прочитать его description
свойство.Так как мы уже достигли последнего пункта, код формата фактически заканчивается после символа @
, и, как указал @Kevin Ballard, -1
анализируется как буквальный текст.