Как обойти квадратную скобку в NSUserDefaults target- C - PullRequest
0 голосов
/ 26 марта 2020

При использовании следующего кода для извлечения аргументов он работает правильно в большинстве случаев, но не для формата IPv6. После первого взгляда кажется связанным с символами [ и ], которые, как мне кажется, имеют особое значение для анализа:

Это работает (szServer содержит 1.2.3.4):

. / Myapp -адрес "1.2.3.4"

Это не работает (szServer равен nil):

. / Myapp -address "[2001: : abc] "

Я, к сожалению, не очень хорошо разбираюсь в объективе - C, так что это, вероятно, тривиальная проблема, но, глядя на NSUserDefaults документацию или на поиск по inte rnet " NSUserDefaults с квадратной скобкой " не дает (мне) света на топи c.

int main(int argc, char *argv[])
{
    @autoreleasepool {
        NSUserDefaults *args = [NSUserDefaults standardUserDefaults];
        NSString * szServer = [args stringForKey:@"address"];

    }
}

Буду также признателен за разъяснение того, что происходит .

1 Ответ

2 голосов
/ 26 марта 2020

Это работает, если вы заключаете в кавычки в своем аргументе:

./myapp -address '"[2001::abc]"'

Для параметров командной строки -<key> <value> значение интерпретируется как список свойств старого стиля (NextStep-era), не только в виде дословной строки.

Это означает, что, например, можно передавать массивы и словари. Если вы измените свой код, чтобы использовать objectForKey: вместо stringForKey:, он получит массив из этого:

./myapp -address '("[2001::abc]")'

Или словарь из этого:

./myapp -address '{address="[2001::abc]";}'

Поскольку различные символы могут быть «специальными» при интерпретации этого формата, строки должны заключаться в кавычки, если в них есть какие-либо символы за пределами ограниченного набора. Очевидно, левая квадратная скобка является таким символом.

Если вам нужно выяснить синтаксис, используемый для данного аргумента, вы можете написать простую программу, которая создает массив с нужным объектом списка свойств, и зарегистрируйте этот массив. Очевидно, что результат будет включать круглые скобки для форматирования массива, но объект в массиве также будет отформатирован по мере необходимости для этого формата старого стиля. (Если вы не обернули объект в коллекцию как массив, он мог бы просто записать себя дословно, как при записи NSString.)

...