Nano Hash - криптовалюты, майнинг, программирование

Разница между NSLog и NSLogv

Кто-нибудь может объяснить разницу между NSLog и NSLogv? Я знаю, что NSLog используется для печати данных в консоли. Но что такое NSLogv?

05.12.2016

Ответы:


1

Предположим, вы хотите написать функцию, похожую на NSLog, но которая помимо записи в журнал также сохраняет сообщение в массив. Как бы вы это реализовали?

Если вы напишете вариативную функцию void MySpecialLog(NSString *format, ...), кто-нибудь сможет вызвать вашу функцию точно так же, как NSLog — MySpecialLog(@"Hello %@!", name); — но единственный способ получить доступ к дополнительным аргументам помимо format — это использовать a va_list. . Здесь нет оператора знака знака в C или Obj-C, что позволяет передавать их непосредственно в NSLog внутри функции.

NSLogv решает эту проблему, одновременно принимая все дополнительные аргументы через файл va_list. Его подпись void NSLogv(NSString *format, va_list args). Вы можете использовать его для создания собственных оболочек NSLog.

Объект-C

void MySpecialLog(NSString *format, ...)
  NS_FORMAT_FUNCTION(1, 2)
    // The NS_FORMAT_FUNCTION attribute tells the compiler to treat the 1st argument like
    // a format string, with values starting from the 2nd argument. This way, you'll
    // get the proper warnings if format specifiers and arguments don't match.
{
    va_list args;
    va_start(args, format);

    // Do something slightly more interesting than just passing format & args through...
    NSString *newFormat = [@"You've called MySpecialLog()! " stringByAppendingString:format];

    NSLogv(newFormat, args);

    va_end(args);
}

Вы даже можете использовать ту же технику, чтобы обернуть NSLog методом Obj-C. (А так как -[NSString initWithFormat:] имеет аналогичный вариант под названием -initWithFormat:arguments:, его тоже можно обернуть.)

- (void)log:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2)
{
    // Similarly to the above, we can pass all the arguments to -initWithFormat:arguments:.
    va_list args;
    va_start(args, format);
    NSString *message = [[NSString alloc] initWithFormat:format arguments:args];
    va_end(args);

    // Why not both?
    va_start(args, format);
    NSLogv(format, args);
    va_end(args);
}

Быстрый

В Swift вы можете сделать это с помощью функции с переменным числом аргументов, принимающей CVarArg...:

func mySpecialLog(_ format: String, _ args: CVarArg...) {
    withVaList(args) {
        NSLogv("You've called mySpecialLog()! " + format, $0)
    }
}
05.12.2016
  • Разве это не должно быть ... если у вас не было NSLog, ... в первой строке вашего первого примера кода? 05.12.2016
  • @jtbandes: Точно. Вы создаете замену NSLog, используя NSLogv, поэтому если у вас нет NSLogv, звучит для меня неправильно. 05.12.2016

  • 2

    Вообще говоря, суффикс v означает, что функция принимает va_list в качестве аргумента, а не вариативный список аргументов.

    Это касается NSLog и NSLogv:

    void NSLog(NSString *format, ...);
    
    void NSLogv(NSString *format, va_list args);
    

    Это полезно в некоторых очень специфических ситуациях, когда вам нужно "обернуть" функцию, которая принимает аргументы с переменным числом аргументов. Если тебе это нужно, ты узнаешь. В противном случае вы можете смело игнорировать его.

    05.12.2016
  • Пожалуйста, объясните, что вам нужно обернуть функцию, которая принимает аргументы с переменным числом аргументов. 05.12.2016

  • 3

    NSLog — это функция варадика, что означает, что она принимает переменное количество аргументов. Но иногда программисты хотят реализовать свою собственную функцию-оболочку varadic, которая делает что-то еще перед вызовом NSLog.

    Если бы NSLog была единственной функцией, это было бы невозможно, потому что вы не можете передать набор varadic-аргументов (он же va_list) другой varadic-функции.

    Вот почему NSLogv существует отдельно от NSLog, который является просто оболочкой, которая принимает переменное количество аргументов и передает их NSLogv.

    05.12.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..