[英]Objective-C Default Argument Value
嘿那里,快速提問。 我確信這是一個簡單的答案。
來自PHP,我習慣於聲明一個帶有默認參數值的函數,如下所示:
function myFunction ($array, $sort = FALSE) {
}
我沒有填充sort參數,該函數將繼續使用默認值false。 在Obj-C中,有類似的東西嗎?
我正在編寫“Objective In Objective-C 2.0編程”一書中的練習,它希望我重新編寫一個分數類打印函數來默認 - 不要減少分數,但是如果給出了為TRUE的值為TRUE ,繼續減少分數,然后打印。 本章(書中沒有任何內容)提供了有關此內容的任何信息。
謝謝你們的幫助:D
Objective-C本身不存在默認參數。 它們實際上並不是真的,因為參數計數與方法名稱密不可分 - 每個冒號對應一個參數。
然而,Objective-C程序員通過創建“方便”方法來實現類似的目標,這些方法只調用更“原始”的方法,其中一些參數用默認值填充。 例如, -[NSArray indexOfObject:]
可以實現為-[NSArray indexOfObject:inRange:]
,其參數為NSMakeRange(0, [self count])
用於inRange:
part。
但在這種情況下,我認為你的書並不是在談論這個問題。 我認為它只是意味着如果為reduce:
參數給出YES,則減少分數,如果給出NO則不減少它。
有兩種標准模式可以實現您的目標。
(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將使用內部定義的默認配置讀取文件的內容。 該默認配置可能會隨時間而變化。
這個問題是超級舊的,但是如果有人發現它,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是明智的。
可怕的壞死,但對於任何使用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) {
// ...
}
請注意,必須在函數的所有定義和聲明中指定該屬性。
不,默認參數是C ++的一個特性,而不是C或Objective-C。
在objective-c中您需要做的是以下內容(使用上面的偽代碼):
function myFunction ($array, $sort)
function myFunction ($array)
// call myFunction($array, FALSE)
使用#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);
並且您將獲得日期為2015/01/01的NSDate
對象。
如果函數不是static
,那么構建一個像這樣的新函數:
-(NSDate*)GetDateFromYearOnly:(NSUInteger)year;
並致電:
[self getDateFromYear:year month:1 day:1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.