2009-05-16 26 views
13

ここに簡単な質問があります。私は単純な答えがあると確信しています。私はsortパラメータが満たされていなかったObjective-Cデフォルトの引数値

function myFunction ($array, $sort = FALSE) { 

} 

、関数は偽の既定値を続行します:PHPから来る

は、私はこのようなデフォルトの引数の値を持つ関数を宣言するために使用しています。 Obj-Cでは、似たようなことはありますか?

私は "Programming In Objective-C 2.0"の練習をしていますが、分数を減らさないように分数クラスの印刷関数を書き直したいと思っていますが、値TRUE減量が与えられたら、分数を減らしてから印刷してください。この章では、これについての情報は何も記載していません。あなたの助けの人たちのための

ありがとう:D

+0

重複:http://stackoverflow.com/questions/561185/optional-arguments-in-objective-c-2-0 –

答えて

1

いいえ、デフォルト引数は、C++の機能ではなく、CまたはObjective-Cのです。

function myFunction ($array, $sort) 

function myFunction ($array) 
// call myFunction($array, FALSE) 
+0

実際には、それはC + +のismだからあなたはそれをすることはできません。 –

24

デフォルト引数は、それ自体のObjective-C、には存在しません:あなたはObjective-Cで行う必要がありますどのような

は、(上記のあなたの擬似コードを使用して)次のようです。引数の数はメソッド名に密接に結びついているので、実際にはできません。各コロンは1つの引数に対応します。

Objective-Cプログラマは、デフォルト値で埋め込まれた引数のいくつかを使用して、より「プリミティブな」メソッドを呼び出すだけの「便利な」メソッドを作成することで、同様の目標を達成します。例えば、-[NSArray indexOfObject:]は、inRange:部分の場合、NSMakeRange(0, [self count])の引数を持つ-[NSArray indexOfObject:inRange:]のバージョンとして実装できます。

この場合、私はあなたの本がそれについて話しているとは思わない。私は単にreduce:引数にYESが指定されていれば小数点を減らし、NOが与えられればそれを減らさないことを意味すると思います。

9

目的を達成するための標準パターンは2つあります。

(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; 

最初の3は、概念的にある第四版に至るまでの呼び出しとして実装[具体的に、おそらく、私はチェックしませんでした]。 -compare:calls -compare:options:range:locale:3つの追加引数の適切なデフォルト値を指定します。

(2)もう1つのパターンは、メソッドの多数の引数バージョンを実装し、引数がNULL/nilである場合にデフォルト値を提供するか、デフォルト値が望ましいことを示す値に設定することです。 NSDataにはこのパターンで実装されたメソッドがあります。たとえば:あなたはreadOptionsMask引数に0を渡すと

+ (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask 
      error:(NSError **)errorPtr; 

は、NSDataのは、内部的に定義されたデフォルトの設定を使用してファイルの内容を読み込みます。そのデフォルト設定は、時間とともに変化する可能性があります。

8

この質問は超古いですが、場合には、誰もがそれ、PHPコードのObjective-Cのバージョン(これがクラス内にあると仮定)は、おそらくこのようなものになるだろう見つける:私が使用

-(id)myFunction:(NSArray*)array { 
    return [self myFunction:array withSort:FALSE]; 
} 

-(id)myFunction:(NSArray*)array withSort:(BOOL)useSort { 
    // CODE 
} 

(id)はPHPコードにデータ型情報がないためです。 (id)を実際のデータ型に置き換えることは賢明です。

+0

素晴らしい、かなりスマート。 –

4

ひどいネクロですが、これを狙っている人にとって、Xcode 4.5はでC関数のオーバーロードをサポートしています(Clang)。

オーバーロードされた関数の引数の数が違うことが許されます。そのため、C関数があなたがしようとしているものに対して適切であれば、それを使ってデフォルトの引数値を得ることができます。

ここで両者がPrintNumと呼ばれる、二つの機能を持つ.hファイルの不自然な例です:

// 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) { 
    // ... 
} 

注意関数のすべての定義と宣言。

+0

ありがとう、このヒントを愛する – xhan

0

#defineを使用して同じ効果を簡単に達成できます。

例:ヘッダファイル内

あなたの機能:

+(NSDate *)getDateFromYear:(NSUInteger)年月:(NSUInteger)月の日:(NSUInteger)の日。

ヘッダファイル内のパラメータ機能は 'の#define' を追加します。

の#define GetDateFromYearOnly(年)[YourClassName getDateFromYear:年月:1日:1]

その後、あなたは次のように関数を使用することができます: NSDate * 2015Date = GetDateFromYearOnly(2015);

そして、日付2015/01/01のNSDateオブジェクトを取得します。

この関数が静的でない場合は、次のような新しい関数を作成してください。 - (NSDate *)GetDateFromYearOnly:(NSUInteger)year; とコール: [自己getDateFromYear:年月:1日:1]

関連する問題