2009-05-16 18 views
13

Hey, hier eine kurze Frage. Ich bin mir sicher, dass es eine einfache Antwort gibt.Objective-C Default Argument Wert

von PHP kommend, ich bin zu erklären, eine Funktion mit einem Standardargument Wert wie folgt verwendet:

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

} 

ich die Sortierparameter wurde nicht gefüllt ist, würde die Funktion mit dem Standardwert false weiter . Gibt es in Obj-C eine ähnliche Sache?

Ich arbeite durch die Übungen in meinem "Programmieren in Objective-C 2.0" Buch, und es will, dass ich eine Bruchklasse Druckfunktion neu schreiben standardmäßig nicht den Bruch reduzieren, aber wenn der Wert TRUE Um zu reduzieren, gehen Sie voran und reduzieren Sie den Bruch, dann drucken Sie. Das Kapitel (Nirgendwo im Buch) gibt darüber Auskunft.

Vielen Dank für Ihre Hilfe Jungs: D

+0

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

Antwort

1

Nein, sind Standardargumente ein Merkmal von C++, nicht C oder Objective-C.

Was würden Sie in Objective-c zu tun haben, ist die folgende (Ihre Pseudo-Code unter Verwendung von oben):

function myFunction ($array, $sort) 

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

tatsächlich, Nein, das kannst du nicht machen, denn das ist auch ein C++ - ism ... –

24

Standard Argumente sind nicht in Objective-C, per se. Sie können das nicht wirklich, weil die Anzahl der Argumente untrennbar mit dem Methodennamen verknüpft ist - jeder Doppelpunkt entspricht einem Argument.

Objective-C-Programmierer erreichen jedoch ein ähnliches Ziel, indem sie "Convenience" -Methoden erstellen, die einfach eine "primitivere" Methode aufrufen, wobei einige der Argumente mit Standardwerten ausgefüllt werden. Zum Beispiel könnte -[NSArray indexOfObject:] als Version von -[NSArray indexOfObject:inRange:] mit einem Argument von NSMakeRange(0, [self count]) für den inRange: Teil implementiert werden.

In diesem Fall denke ich nicht, dass Ihr Buch darüber spricht. Ich denke, es bedeutet einfach, den Bruch zu reduzieren, wenn für das Argument reduce: JA angegeben wird, und es nicht zu reduzieren, wenn NEIN angegeben wird.

9

Es gibt zwei Standardmuster, um das zu erreichen, was Sie wollen.

(1) schreiben Sie eine viele Argumentform einer Methode und bieten Sie dann weniger Argumente Bequemlichkeit Versionen. Betrachten wir zum Beispiel die folgenden Methoden auf 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; 

Die ersten drei konzeptionell sind [und wahrscheinlich konkret, hat prüfe ich nicht] als Anrufe bis zur vierten Version implementiert. Das ist -compare: ruft -compare auf: options: range: locale: mit entsprechenden Standardwerten für die drei zusätzlichen Argumente. Das andere Muster besteht darin, die Version mit vielen Argumenten der Methode zu implementieren und Standardwerte anzugeben, wenn ein Argument NULL/NIL ist oder auf einen Wert gesetzt ist, der angibt, dass der Standardwert gewünscht wird. NSData verfügt über Methoden, die mit diesem Muster implementiert werden. Zum Beispiel:

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

Wenn Sie 0 für das readOptionsMask Argument übergeben, wird die NSData den Inhalt der Datei liest eine intern definierte Standardkonfiguration verwenden. Diese Standardkonfiguration kann sich im Laufe der Zeit ändern.

8

Diese Frage ist super alt, aber falls jemand es findet, die Objective-C-Version des PHP-Code (vorausgesetzt, diese innerhalb einer Klasse ist) wäre wahrscheinlich so etwas wie diese:

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

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

I verwendet (id) s, da in Ihrem PHP-Code keine Datentypinformationen enthalten sind. Es wäre ratsam, die IDs durch tatsächliche Datentypen zu ersetzen.

+0

Ehrfürchtig, ziemlich schlau. –

4

Schrecklicher Nekro, aber für jeden, der dies googelt, unterstützt Xcode 4.5 (über Clang) Überlastung von C-Funktionen mit __attribute__((overloadable)).

Überladene Funktionen dürfen eine unterschiedliche Anzahl von Argumenten haben. Wenn also C-Funktionen für das geeignet sind, was Sie versuchen, können Sie diese verwenden, um Standardargumentwerte zu erhalten.

Hier ist ein konstruiertes Beispiel einer .h-Datei mit zwei Funktionen, die beide PrintNum genannt:

// 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); 

und in der .m-Datei:

__attribute__((overloadable)) 
void PrintNum(NSNumber *number) { 
    PrintNum(number, 10); 
} 

__attribute__((overloadable)) 
void PrintNum(NSNumber *number, NSUInteger base) { 
    // ... 
} 

Beachten Sie, dass das Attribut muss angegeben werden, in alle Definitionen und Deklarationen der Funktion.

+0

Danke, liebe diese Tipps – xhan

0

Mit #define können Sie den gleichen Effekt erzielen.

Beispiel:

Ihre Funktion in Header-Datei:

+ (NSDate *) getDateFromYear: (NSUInteger) Jahr Monat: (NSUInteger) Monat Tag: (NSUInteger) Tag;

hinzufügen '#define' für Parameterfunktion in Header-Datei:

#define GetDateFromYearOnly (Jahr) [YourClassName getDateFromYear: Jahr Monat: 1 Tag: 1]

Dann können Sie Ihre Funktion nutzen wie : NSDate * 2015Date = GetDateFromYearOnly (2015);

Und Sie erhalten ein NSDate-Objekt mit Datum 01.01.2015. Wenn die Funktion nicht statisch ist, erstellen Sie eine neue Funktion wie: - (NSDate *) GetDateFromYearOnly: (NSUInteger) year; Und rufen: [self getDateFromYear: Jahr Monat: 1 Tag: 1]

Verwandte Themen