来自PHP,我习惯用这样的方式声明一个默认参数值的函数:
function myFunction ($array, $sort = FALSE) {
}
我没有填充sort参数,该函数将继续使用默认值false。在Obj-C中,有类似的东西吗?
我正在编写“Objective In Objective-C 2.0编程”一书中的练习,它希望我重新编写一个分数类打印函数来默认 - 不减少分数,但如果值为TRUE,则给出减少,继续减少分数,然后打印。本章(书中没有任何内容)提供了有关此内容的任何信息。
感谢您的帮助:D
答案 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]