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

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

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

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

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

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

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

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

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

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

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

(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 будет читать содержимое файла, используя внутренне определенную конфигурацию по умолчанию. Эта конфигурация по умолчанию может меняться со временем.

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

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

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

Ужасный necro, но для тех, кто походит в 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) { // ... } 

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

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

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

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

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

Пример:

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

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

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

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

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

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

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