Как избежать квадратной скобки в NSUserDefaults цель-C

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

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

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

Это не работает (szServer - ноль):

./myapp -адрес "[2001 :: abc]"

К сожалению, я не свободно владею целью-C, так что это, вероятно, тривиальная проблема, но просмотр документации NSUserDefaults или поиск в Интернете « NSUserDefaults с квадратными скобками » не проливает свет на эту тему (для меня).

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

    }
}

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

Всего 1 ответ


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

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

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

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

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

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

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

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

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


Есть идеи?

10000