Php Objective-C默认参数值
嘿,这里有个问题。我相信有一个简单的答案 来自PHP,我习惯于用默认参数值声明函数,如下所示: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
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]
重复:棒极了,不过相当聪明。