2010-03-17 8 views
2

J'essaie d'utiliser une classe Obj-C externe dans mon projet MacRuby, mais je n'arrive pas à comprendre comment l'importer. Plus précisément, je veux utiliser ObjectiveResource dans un projet MacRuby 0.5 (puisque ActiveResource ne fonctionne pas encore).Comment utiliser les classes Obj-C dans MacRuby

J'ai été aussi loin que la commande 'framework' dans MacRuby, mais cela ne semble s'appliquer qu'aux frameworks actuels.

Questions: où dois-je installer le répertoire objectif-ressource? comment puis-je tirer ces classes dans mon code ruby?

Merci pour toute aide!

Répondre

0

Avez-vous consulté l'exemple this pour créer un ensemble ObjC?

+0

Oui, j'ai essayé, mais je ne travaille pas du tout pour moi. Je me suis un peu rapproché en créant un paquet manuellement selon cet exemple (http://www.mail-archive.com/[email protected]/msg00940.html), mais c'est un processus très pénible et je ne l'ai pas tout à fait au travail. Je suppose que le code ObjectiveResource (destiné aux applications iPhone) n'est pas tout ce qui convient pour cela? – beno1604

+1

Quelles erreurs obtenez-vous lorsque vous essayez le bundle? Pouvez-vous modifier votre message pour inclure les messages d'erreur? – sal

4

Vous pouvez accéder directement à la classe à l'aide de ClassName.new.

Si vous avez une classe nommée Utilities dans votre projet et qu'elle a une méthode nommée greeting :, vous l'appelleriez comme ça.

util = Utilities.new 
puts util.greeting("Good morning") 

Aucune déclaration de besoin ou de structure n'est requise. Incroyablement simple n'est-ce pas. J'ai découvert ce regarder le Peepcode screencast sur MacRuby.

3

Aussi, si vous êtes intéressé à appeler le code Ruby de Objective-c, voici un extrait de la liste de diffusion MacRuby:

Une fois le moteur d'exécution MacRuby est initialisé, vous pouvez accéder à tous vos objets Objective-C de Rubis. Par exemple, si vous avez une classe Objective-C nommée Foo, vous pouvez le faire `Foo.new », etc.

Une autre possibilité est de passer vos objets Objective-C à une méthode Ruby en utilisant [NSObject performRubySelector:].

rubis:

class Foo 
    def test(o) 
    o.something 
    end 
end 

objc:

MyObject *o = [MyObject new]; // where o responds to -something 
MacRuby *runtime = [MacRuby sharedRuntime]; 
id foo_obj = [runtime evaluateString:@"new Foo"]; 
[foo_obj performRubySelector:@selector(test:) withArguments: o, NULL]; 

Vérifiez la API entière ici: http://www.macruby.org/trac/browser/MacRuby/trunk/include/ruby/objc.h

Discussion: http://lists.macosforge.org/pipermail/macruby-devel/2010-April/004715.html

(Edit) Cela dit, peut-être le plus facile manière est d'ajouter un fichier d'en-tête pour votre fichier ruby, contenant votre metho ds équivalents.

Supposons que vous ayez cette classe rubis:

class Foo 
    def bar(moo) 
    "a string like #{moo}" 
    end 
end 

de sorte que le fichier d'en-tête équivalent sera quelque chose comme ça:

@interface Foo : NSObject 
- (NSString *)bar:(NSString *)moo 
@end 

Maintenant, juste #import l'en-tête et d'utiliser vos classes de rubis standard Obj-C provenant de votre code Obj-C:

NSString *aString; 
Foo *myFoo; 
aString = [myFoo bar:@"me"]; 

Cela peut sembler bizarre, mais ça fonctionne. Essentiellement, l'idée est de fermer la gueule du compilateur et de le laisser compiler votre code sans se plaindre des méthodes manquantes.Ensuite, au moment de l'exécution, cela fonctionnera (je suppose que grâce à la nature dynamique d'Obj-C lui-même). En passant, pour imiter le comportement sans caractère de ruby, id est votre ami en écrivant des signatures de méthodes dans le fichier d'en-tête.