1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[Obj-C] Statische Funktionen?

Dieses Thema im Forum "OS X-Developer" wurde erstellt von fuxx1.0, 13.03.08.

  1. fuxx1.0

    fuxx1.0 Golden Delicious

    Dabei seit:
    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. ;)
     
  2. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    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.
     
  3. fuxx1.0

    fuxx1.0 Golden Delicious

    Dabei seit:
    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. ;)
     
  4. fuxx1.0

    fuxx1.0 Golden Delicious

    Dabei seit:
    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
     
  5. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Weil du von Objekt-Funktionen sprichst. Methoden und Funktionen sind grundverschieden.

    Es ist eine Klassenmethode, keine Funktion. Daher kann es nicht so etwas wie eine statische Funktion sein.

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

    "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.
     

Diese Seite empfehlen