Mat*_*gan 14 php methods class function objective-c
嘿那里,快速提问.我确信这是一个简单的答案.
来自PHP,我习惯于声明一个带有默认参数值的函数,如下所示:
function myFunction ($array, $sort = FALSE) {
}
Run Code Online (Sandbox Code Playgroud)
我没有填充sort参数,该函数将继续使用默认值false.在Obj-C中,有类似的东西吗?
我正在编写"Objective In Objective-C 2.0编程"一书中的练习,它希望我重新编写一个分数类打印函数来默认 - 不要减少分数,但是如果给出了为TRUE的值为TRUE ,继续减少分数,然后打印.本章(书中没有任何内容)提供了有关此内容的任何信息.
谢谢你们的帮助:D
Chu*_*uck 25
Objective-C本身不存在默认参数.它们实际上并不是真的,因为参数计数与方法名称密不可分 - 每个冒号对应一个参数.
然而,Objective-C程序员通过创建"方便"方法来实现类似的目标,这些方法只调用更"原始"的方法,其中一些参数用默认值填充.例如,-[NSArray indexOfObject:]可以实现为-[NSArray indexOfObject:inRange:]具有NSMakeRange(0, [self count])该inRange:部分的参数的版本.
但在这种情况下,我不认为你的书正在讨论这个问题.我认为它只是意味着如果为reduce:参数给出YES则减少分数,如果给出NO则不减少分数.
bbu*_*bum 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;
Run Code Online (Sandbox Code Playgroud)
前三个概念上[并且可能具体地说,我没有检查]实现为第四个版本的调用.那就是-compare:calls -compare:options:range:locale:具有三个附加参数的适当默认值.
(2)另一种模式是实现方法的多个参数版本,并在参数为NULL/nil时设置默认值,或者设置为某个值,表示需要默认值.NSData具有使用此模式实现的方法.例如:
+ (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask
error:(NSError **)errorPtr;
Run Code Online (Sandbox Code Playgroud)
如果为readOptionsMask参数传递0,NSData将使用内部定义的默认配置读取文件的内容.该默认配置可能会随时间而变化.
这个问题是超级旧的,但是如果有人发现它,PHP代码的Objective-C版本(假设这是在一个类中)可能是这样的:
-(id)myFunction:(NSArray*)array {
return [self myFunction:array withSort:FALSE];
}
-(id)myFunction:(NSArray*)array withSort:(BOOL)useSort {
// CODE
}
Run Code Online (Sandbox Code Playgroud)
我使用(id)s,因为PHP代码中没有数据类型信息.用实际数据类型替换(id)s是明智的.
可怕的死灵,但对于任何谷歌搜索的人来说,Xcode 4.5 支持(通过Clang)使用__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);
Run Code Online (Sandbox Code Playgroud)
并在 .m 文件中:
__attribute__((overloadable))
void PrintNum(NSNumber *number) {
PrintNum(number, 10);
}
__attribute__((overloadable))
void PrintNum(NSNumber *number, NSUInteger base) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
请注意,必须在函数的所有定义和声明中指定该属性。
不,默认参数是 C++ 的功能,而不是 C 或 Objective-C 的功能。
您需要在 Objective-C 中执行以下操作(使用上面的伪代码):
function myFunction ($array, $sort)
function myFunction ($array)
// call myFunction($array, FALSE)
Run Code Online (Sandbox Code Playgroud)