Objective-C默认参数值

时间:2009-05-16 05:49:14

标签: php objective-c function class methods

嘿那里,快速提问。我确信这是一个简单的答案。

来自PHP,我习惯用这样的方式声明一个默认参数值的函数:

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

}

我没有填充sort参数,该函数将继续使用默认值false。在Obj-C中,有类似的东西吗?

我正在编写“Objective In Objective-C 2.0编程”一书中的练习,它希望我重新编写一个分数类打印函数来默认 - 不减少分数,但如果值为TRUE,则给出减少,继续减少分数,然后打印。本章(书中没有任何内容)提供了有关此内容的任何信息。

感谢您的帮助:D

6 个答案:

答案 0 :(得分:25)

Objective-C本身不存在默认参数。它们不能真实,因为参数计数与方法名称密不可分 - 每个冒号对应一个参数。

Objective-C程序员通过创建“方便”方法来实现类似的目标,这些方法只调用更“原始”的方法,其中一些参数用默认值填充。例如,-[NSArray indexOfObject:]可以作为-[NSArray indexOfObject:inRange:]的版本实现,NSMakeRange(0, [self count])部分的参数为inRange:

在这种情况下,我不认为你的书正在讨论这个问题。我认为它只是意味着如果为reduce:参数给出YES则减少分数,如果给出NO则不减少它。

答案 1 :(得分:10)

有两种标准模式可以实现您的目标。

(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;

如果为readOptionsMask参数传递0,NSData将使用内部定义的默认配置读取文件的内容。该默认配置可能会随时间而变化。

答案 2 :(得分:8)

这个问题超级老了,但是如果有人发现它,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是明智的。

答案 3 :(得分:4)

可怕的死灵,但是对于任何使用Google搜索的人来说,Xcode 4.5支持(通过Clang)使用__attribute__((overloadable))重写C函数。

允许重载函数具有不同数量的参数,因此如果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) {
    // ...
}

请注意,必须在函数的所有定义和声明中指定该属性。

答案 4 :(得分:1)

不,默认参数是C ++的一个特性,而不是C或Objective-C。

您在objective-c中需要做的是以下内容(使用上面的伪代码):

function myFunction ($array, $sort)

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

答案 5 :(得分:0)

您可以使用#define轻松达到相同的效果。

头文件中的函数:

+(NSDate*)getDateFromYear:(NSUInteger)year month:(NSUInteger)month day:(NSUInteger)day;

在头文件中添加#define参数函数:

#define GetDateFromYearOnly(year) [YourClassName getDateFromYear:year month:1 day:1]

然后你可以使用像:

这样的功能
NSDate* 2015Date = GetDateFromYearOnly(2015);

您将获得一个NSDate对象,日期为2015/01/01。

如果函数不是static,请构建一个这样的新函数:

-(NSDate*)GetDateFromYearOnly:(NSUInteger)year;

并致电:

[self getDateFromYear:year month:1 day:1]