如何混合 Objective-C 与 Ruby 编程

junwong 发布于 2012/08/29 11:21
阅读 4K+
收藏 32
关于 RubyMotion 我已经写过很多文章了,但如何混用Objective-C与Ruby还从未涉及到。实际上你能在RubyMotion项目中使用Objective-C代码,也可以在传统Objective-C的App中使用Ruby代码。也许你一次听来觉得像黑魔法一样,所以来一起看看下面这些示例。

Objective-C in Ruby
很多iOS开发者在现有的Objecive-C代码中存在大量深层的备份日志,这样就为项目手动转换为 RubyMotion 带来了很大的痛苦。然而幸运的是现在仅仅只需要将编译好的Objective-C代码添加到我们的新RubyMotion应用里。

比如我们要在 RubyMotion 应用中使用 Objective-C 形式的 CYAlert 类:
// CYAlert.h
#import <UIKit/UIKit.h>@interface  CYAlert : NSObject

+ (void)show;@end 
// CYAlert.m
#import "CYAlert.h"

@implementation CYAlert

+ (void)show {
    UIAlertView *alert = [[UIAlertView alloc] init];
    alert.title = @"This is Objective-C";
    alert.message = @"Mixing and matching!";
    [alert addButtonWithTitle:@"OK"];
    [alert show];
    [alert release];
}@end 



为了在RubyMotion应用中能正常使用,这里需要将CYAlert的两个文件都放置到类似 ./vendor/CYAlert 里面,然后在 Rakefile: 中告诉 RubyMotion 使用vendor_project创建那个文件夹。
Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = 'MixingExample'

  # ./vendor/CYAlert contains CYAlert.h and CYAlert.m
  app.vendor_project('vendor/CYAlert', :static)
end



那么现在在 AppDelegate 中,我们这样使用 CYAlert:
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    CYAlert.show
    true
  end
end



非常简单,不是吗?关于RubyMotion是如何做到这一点的,你可以从RubyMotion docs.查阅更多信息。

CocoaPods
因为RubyMotion能够创建旧式 Xcode 项目,所以使用CocoaPods系统是不需要大量的图示解说的。
require 'motion-cocoapods'

Motion::Project::App.setup do |app|
  # ...
  app.pods do
    pod 'JSONKit'
  end
end



Ruby in Objective-C
这里我们有两种方法编译成普通字节码:直接将Ruby的类打包后再Objective-C项目中使用,感觉不可思议?OK,假设我们有一个CYAlert类,Ruby形式。如下代码演示:
# ./app/CYAlert.rb

class CYAlert
  def self.show
    alert = UIAlertView.alloc.init
    alert.title = "This is Ruby"
    alert.message = "Mixing and matching!"
    alert.addButtonWithTitle "OK"
    alert.show
  end
end



如果运行 rake static,将会把项目编译成静态库 ./build/<app name>-universal.a。下面我们通过几个步骤看看如何在Xcode项目中使用它:
1,项目中添加静态库


2,然后添加下图的几个库


3,初始化 RubyMotion 运行时
// main.m

int main(int argc, char *argv[])
{
  @autoreleasepool {
      void RubyMotionInit(int, char **);
      RubyMotionInit(argc, argv);
      ...
  }
}



那么剩下的都是小菜一碟,不过有个警告:RubyMotion不会为项目生成 .h 文件,所以需要使用Objective-C手动定义这些类与它的方法。所以手动写一个 CYAlert.h :
// CYAlert.h@interface  CYAlert : NSObject
+ (void)show;@end 

@implementation CYAlert
// Empty on purpose@end 



也别忘了添加头文件
// ExampleDelegate.m

#import "CYAlert.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...

    [CYAlert show];
    return YES;
}



所以,如果你觉得写Objective-C代码很痛苦的话(译者:觉得它比任何其他语言都痛苦),完全可以使用Ruby来写相同的功能,最后转换一下就OK。
好了,这里放出Github上源码下载

原文链接 , OSChina.NET 原创翻译
加载中
0
铂金小鸟
铂金小鸟
楼下蛋疼嘛?
0
fys
fys
这两种语言都挺难受
0
鞋底两万里
鞋底两万里
谁把top10的语言来个大杂会呗
0
风一样的女子
风一样的女子
不,楼上有多蛋疼?
0
铂金小鸟
铂金小鸟
亏求高人来个 java,c,c++,c#,vb,php,python,obj-c,ruby,js等等混合编程的东西。
微笑的书生
微笑的书生
想一想就蛋疼,编程真难啊
傅小黑
傅小黑
HaXe语言?
0
hmly
hmly
裆部隐隐作痛
cha0xc
cha0xc
得去看医生了。
0
鞋底两万里
鞋底两万里

引用来自“fants”的答案

亏求高人来个 java,c,c++,c#,vb,php,python,obj-c,ruby,js等等混合编程的东西。
这个必须韩国人来做!
0
unknown
unknown
我表示蛋疼!
0
puras
puras
看到第一段代码中的一堆@@@@@@@@@@就疼。。。
洲宝
洲宝
@junwong 额.. 在看 oc...!
junwong
junwong
这还算好的, Objective-C 代码繁琐以及恶心的地方多的是
0
w
whtoo
objc 还好吧 挺顺手的工具 杂都这种看法 。。。
返回顶部
顶部