• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

[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. ;-)
 
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.
 
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. ;-)
 
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
 
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.