Подтвердить что ты не робот

Objective-C Значение аргумента по умолчанию

Эй, тут быстрый вопрос. Я уверен, что есть простой ответ.

Исходя из PHP, я привык объявлять функцию со значением аргумента по умолчанию следующим образом:

function myFunction ($array, $sort = FALSE)  {

}

I параметр sort не был заполнен, функция будет продолжать со значением по умолчанию false. В Obj-C есть ли подобная вещь?

Я работаю над упражнениями в своей книге "Программирование в Objective-C 2.0", и он хочет, чтобы я переписал функцию печати класса фракций по умолчанию, но не уменьшил ее, но если значение TRUE для дается сокращение, сокращаем фракцию, затем печатаем. Глава (нигде в книге) не дает никакой информации об этом.

Спасибо за помощь ребятам: D

4b9b3361

Ответ 1

Аргументы по умолчанию не существуют в Objective-C, как таковые. Они не могут на самом деле, потому что счет аргумента неразрывно связан с именем метода - каждый двоеточие соответствует одному аргументу.

Программисты

Objective-C выполняют аналогичную цель, создавая "удобные" методы, которые просто вызывают более "примитивный" метод с некоторыми аргументами, заполненными значениями по умолчанию. Например, -[NSArray indexOfObject:] может быть реализована как версия -[NSArray indexOfObject:inRange:] с аргументом NSMakeRange(0, [self count]) для части inRange:.

В этом случае, однако, я не думаю, что ваша книга говорит об этом. Я думаю, что это просто означает уменьшить долю, если для аргумента reduce: дано ДА, а не уменьшать его, если дано NO.

Ответ 2

Существует два стандартных шаблона для достижения того, что вы хотите.

(1) напишите много аргументов метода, а затем предоставите меньше удобных версий аргументов. Например, рассмотрим следующие методы в NSString:

- (NSComparisonResult)compare:(NSString *)string;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask
            range:(NSRange)compareRange;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask
            range:(NSRange)compareRange locale:(id)locale;

Первые три концептуально [и, вероятно, конкретно, я не проверял] реализованы в виде вызовов до четвертой версии. Это -compare: calls -compare: options: range: locale: с соответствующими значениями по умолчанию для трех дополнительных аргументов.

(2) Другой шаблон - реализовать много аргументную версию метода и предоставить значения по умолчанию, когда аргумент равен NULL/nil или задан для некоторого значения, которое указывает, что по умолчанию требуется. NSData имеет методы, которые реализуются с помощью этого шаблона. Например:

+ (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask
            error:(NSError **)errorPtr;

Если вы передадите 0 для аргумента readOptionsMask, NSData будет считывать содержимое файла, используя внутренне определенную конфигурацию по умолчанию. Эта конфигурация по умолчанию может меняться со временем.

Ответ 3

Этот вопрос супер старый, но если кто-нибудь его найдет, версия PHP-кода Objective-C (если это внутри класса), вероятно, будет примерно такой:

-(id)myFunction:(NSArray*)array {
  return [self myFunction:array withSort:FALSE];
}

-(id)myFunction:(NSArray*)array withSort:(BOOL)useSort {
   // CODE
}

Я использовал (id) s, поскольку в вашем PHP-коде отсутствует информация о типе данных. Замена (id) s фактическими типами данных была бы разумной.

Ответ 4

Ужасно некро, но для любого, кто пойдет в Google, поддерживает Xcode 4.5 (через Clang) перегрузка функций C с помощью __attribute__((overloadable)).

Перегруженным функциям разрешено иметь различное количество аргументов, поэтому, если функции C подходят для того, что вы пытаетесь сделать, вы можете использовать это для получения значений аргументов по умолчанию.

Здесь надуманный пример файла .h с двумя функциями, называемыми PrintNum:

// Prints a number in the decimal base
__attribute__((overloadable)) extern void PrintNum(NSNumber *number);

// Prints a number in the specified base
__attribute__((overloadable)) extern void PrintNum(NSNumber *number, NSUInteger base);

и в файле .m:

__attribute__((overloadable)) 
void PrintNum(NSNumber *number) {
    PrintNum(number, 10);
}

__attribute__((overloadable))
void PrintNum(NSNumber *number, NSUInteger base) {
    // ...
}

Обратите внимание, что атрибут должен быть указан во всех определениях и объявлениях функции.

Ответ 5

Нет, аргументы по умолчанию - это функция С++, а не C или Objective-C.

Что вам нужно сделать в objective-c, следующее (используя ваш код psuedo выше):

function myFunction ($array, $sort)

function myFunction ($array)
// call myFunction($array, FALSE)

Ответ 6

Вы можете легко добиться того же эффекта, используя #define.

Пример:

Ваша функция в файле заголовка:

+ (NSDate *) getDateFromYear: (NSUInteger) year month: (NSUInteger) месяц день: (NSUInteger) день;

Добавьте '#define' для функции параметра в файле заголовка:

#define GetDateFromYearOnly (год) [YourClassName getDateFromYear: год месяц: 1 день: 1]

Тогда вы можете использовать функцию: NSDate * 2015Date = GetDateFromYearOnly (2015);

И вы получите объект NSDate с датой 2015/01/01.

Если функция не является статической, создайте новую функцию, например: - (NSDate *) GetDateFromYearOnly: (NSUInteger) год; И позвоните: [self getDateFromYear: год месяц: 1 день: 1]