Php Objective-C默认参数值

Php Objective-C默认参数值,php,objective-c,function,class,methods,Php,Objective C,Function,Class,Methods,嘿,这里有个问题。我相信有一个简单的答案 来自PHP,我习惯于用默认参数值声明函数,如下所示: function myFunction ($array, $sort = FALSE) { } -(id)myFunction:(NSArray*)array { return [self myFunction:array withSort:FALSE]; } -(id)myFunction:(NSArray*)array withSort:(BOOL)useSort { // CO

嘿,这里有个问题。我相信有一个简单的答案

来自PHP,我习惯于用默认参数值声明函数,如下所示:

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

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

-(id)myFunction:(NSArray*)array withSort:(BOOL)useSort {
   // CODE
}
-(NSDate*)GetDateFromYearOnly:(NSUInteger)year;
如果没有填充sort参数,函数将继续使用默认值false。在Obj-C中,是否存在类似的情况

我正在完成“在Objective-C2.0中编程”一书中的练习,它希望我重新编写一个分数类打印函数,默认情况下不减少分数,但是如果reduce的值为TRUE,则继续减少分数,然后打印。这一章(书中没有这一章)提供了这方面的任何信息


谢谢你的帮助:D < /P> < P>不,默认参数是C++的一个特性,不是C或Objul-C./P> 在objective-c中,您必须执行以下操作(使用上面的psuedo代码):


默认参数本身在Objective-C中不存在。它们实际上不能,因为参数计数与方法名有着千丝万缕的联系——每个冒号对应一个参数

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


不过,在这种情况下,我认为你的书并没有提到这一点。我认为这仅仅意味着,如果
reduce:
参数为YES,则减少分数;如果为NO,则不减少分数。

有两种标准模式可用于实现所需目标

(1) 编写方法的多参数形式,然后提供较少的参数方便版本。例如,考虑nStc:

上的下列方法
- (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将使用内部定义的默认配置读取文件内容。默认配置可能会随着时间的推移而改变。

这个问题非常古老,但如果有人发现它,PHP代码的Objective-C版本(假设它在类中)可能是这样的:

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

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

-(id)myFunction:(NSArray*)array withSort:(BOOL)useSort {
   // CODE
}
-(NSDate*)GetDateFromYearOnly:(NSUInteger)year;

我使用了(id)s,因为PHP代码中没有数据类型信息。用实际的数据类型替换(id)是明智的。

但是对于任何在谷歌上搜索的人来说,Xcode 4.5支持(通过)使用
\uu属性(可重载))重载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) {
    // ...
}

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

使用
\define
可以轻松实现相同的效果

头文件中的函数:

+(NSDate*)getDateFromYear:(NSUInteger)year month:(NSUInteger)month day:(NSUInteger)day;
#define GetDateFromYearOnly(year) [YourClassName getDateFromYear:year month:1 day:1]
为头文件中的参数函数添加一个
#define

+(NSDate*)getDateFromYear:(NSUInteger)year month:(NSUInteger)month day:(NSUInteger)day;
#define GetDateFromYearOnly(year) [YourClassName getDateFromYear:year month:1 day:1]
然后您可以使用以下功能:

NSDate* 2015Date = GetDateFromYearOnly(2015);
您将获得一个日期为2015/01/01的
NSDate
对象

如果函数不是静态的,则构建如下新函数:

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

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

-(id)myFunction:(NSArray*)array withSort:(BOOL)useSort {
   // CODE
}
-(NSDate*)GetDateFromYearOnly:(NSUInteger)year;
并致电:

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

重复:棒极了,不过相当聪明。