[Obj-C] Statische Funktionen?

fuxx1.0

Golden Delicious
Registriert
13.03.08
Beiträge
6
Hallo,

ich bin gerade dabei, mich in Objective-C und Cocoa einzuarbeiten. Hab auch schon erfolgreich einen kleinen Taschenrechner programmiert und nun einen Button eingebaut, mit dem überprüft werden kann, ob die eingegebene Zahl eine Primzahl ist. Dazu habe ich mir eine Funktion isPrim geschrieben. Nun habe ich aber keine Ahnung, wie ich die implementiere. Wenn ich "New File -> Cocoa -> Objective-C Class" wähle, hab ich ja ne Klasse, aber ich will ja ne statische Funktion, die ich so aufrufen kann:

if ([isPrim [Zahl1 intValue]]) {*... }

Außerdem würde ich sie eben gerne in eine Mathfunctions.h- und Mathfunctions.m-Datei auslagern, so wie die Klassen eben - nur eben als eine Art Funktionspaket.

Oder versteh' ich da was komplett falsch?! Hab' dann mal versucht, die Funktion in die main.m einzubauen, das ging auch, allerdings erst, als ich den Funktionskopf von Objective-C-Syntax:

(BOOL) isPrim: (int)x

auf C-Syntax:
bool isPrim(int x)

umgeschrieben habe. Hääää? Ich programmiere aber doch in Objective-C und nicht in normalem C?! Außerdem: warum ist die main-Methode in C-Syntax und nicht in obj-C-Syntax?

Hilfe...

P.S.: Hab mal nach "Funktionen" und "statisch" gesucht, aber leider per Suche nix gefunden, also bitte nicht gleich losbashen. ;)
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
a)
Du kannst C-Funktionen schreiben und verwenden. Das geht wie in C:
Code:
// Deklaration
BOOL isPrim( int x );

// Definition
BOOL isPrim( int x ) {
   …
}

// Aufruf
isPrim( 3 );

b)
Objective-C-Funktionen gibt es nicht. Es gibt nur Methoden. Auch nur die werden mit der Klammersyntax aufgerufen.

c)
Es gibt keine statischen Methoden, sondern Klassenmethoden.

d)
Du hast das mit OOP noch nicht so richtig verstanden.

e)
Mir scheint, du legst einfach drauf los. Das bringt nichts.
 

fuxx1.0

Golden Delicious
Registriert
13.03.08
Beiträge
6
Okay, da bin ich schon mal einen Schritt weiter.

d) Wieso nicht?
c) Ist eine Klassenmethode in obj-C dann das gleiche wie eine statische Klasse / Funktion in C#? Dann such ich mal nach diesen Klassenmethoden.

Ich hab jetzt insofern losgelegt, als dass ich mir auf cocoadevcentral einige Tutorials angeschaut habe und danach angefangen habe zu programmieren. Hab schon reichlich Skriptingerfahrung mit PHP und bissi Programmiererfahrung mit C#, also dachte ich, ich stürz' mich einfach mal rein. ;)
 

fuxx1.0

Golden Delicious
Registriert
13.03.08
Beiträge
6
Aha! Diese Klassenmethoden sind also quasi das gleiche wie eine static-Class / -function in C#. Hab das mal so eingebaut:

MyMath.h:
Code:
#import <Cocoa/Cocoa.h>
@interface MyMath : NSObject {
}
+(bool)isPrim:(int)x;
@end

MyMath.m
Code:
#import "MyMath.h"

@implementation MyMath

+(bool)isPrim:(int)x	{
	int i;
	BOOL prim;
	
	prim=TRUE;
	
	for (i=2;i<sqrt(x);i++)	{
		if ( (x%i)==0 )	{
			prim=FALSE;
			break;
			}
		}
		
	return prim;
	}
@end

Aufruf:
Code:
if ([MyMath isPrim:[Zahl1 intValue]]) {
...
}

Läuft. Prima! :)

Komischerweise sagt meine isPrim-Funktion allerdings, dass 4 eine Primzahl ist, was ja so nicht ganz richtig ist. :D
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Okay, da bin ich schon mal einen Schritt weiter.

d) Wieso nicht?
Weil du von Objekt-Funktionen sprichst. Methoden und Funktionen sind grundverschieden.

c) Ist eine Klassenmethode in obj-C dann das gleiche wie eine statische Klasse / Funktion in C#?
Es ist eine Klassenmethode, keine Funktion. Daher kann es nicht so etwas wie eine statische Funktion sein.

Dann such ich mal nach diesen Klassenmethoden.
Such mal nach Polymorphie, Nachrichten und derlei. In Objective-C sind zudem Klassen Objekte. Daraus folgt, dass sie Methoden haben müssen. Außerdem verhalten sie sich polymorph (Keine Ahnung, wie das bei Cis ist.)

Ich hab jetzt insofern losgelegt, als dass ich mir auf cocoadevcentral einige Tutorials angeschaut habe und danach angefangen habe zu programmieren. Hab schon reichlich Skriptingerfahrung mit PHP und bissi Programmiererfahrung mit C#, also dachte ich, ich stürz' mich einfach mal rein. ;)
"Einfach mal reinstürzen" geht deshalb schief, weil du versuchst, andere Konzepte zu transportieren, auch dann, wenn sie nicht passen. Das endet in einem riesigen Missverständnis.

Wenn du Cis kannst, dann schreib Cis-Programme.
Wenn du Objective-C kannst, dann schreib Objective-C-Programme.
Schreibe aber nie Programme in der Syntax von Objective-C mit der Konzeption von Cis.

Du tust damit beiden Unrecht.