Эй, здесь, быстрый вопрос. Я уверен, что есть простой ответ.
Исходя из 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]