簡體   English   中英

Objective-C默認參數值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM