Objective-C Значение аргумента по умолчанию
Эй, тут быстрый вопрос. Я уверен, что есть простой ответ.
Исходя из PHP, я привык объявлять функцию со значением аргумента по умолчанию следующим образом:
function myFunction ($array, $sort = FALSE) {
}
I параметр sort не был заполнен, функция будет продолжать со значением по умолчанию false. В Obj-C есть ли подобная вещь?
Я работаю над упражнениями в своей книге "Программирование в Objective-C 2.0", и он хочет, чтобы я переписал функцию печати класса фракций по умолчанию, но не уменьшил ее, но если значение TRUE для дается сокращение, сокращаем фракцию, затем печатаем. Глава (нигде в книге) не дает никакой информации об этом.
Спасибо за помощь ребятам: D
Ответы
Ответ 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]